在Shiny中通过fileInput导入CSV后无法修改日期列类型的问题
问题解决:修改上传文件的日期列类型并提取年月
核心问题
你的代码里as.Date使用的格式符错误:%m/%d/%y对应两位年份(比如23代表2023),但你的日期格式是mm/dd/yyyy(四位年份),需要改用%m/%d/%Y(大写Y)。另外用lubridate工具处理日期会更省心。
解决步骤
- 先安装并加载
lubridate包(install.packages("lubridate")) - 用
lubridate的mdy()函数直接识别月/日/年格式,无需手动指定格式符 - 用
month()和year()函数提取所需的月份、年份信息
修改后的完整代码
library(shiny) library(dashboard) library(dplyr) library(janitor) # 用于clean_names library(lubridate) # setup sidebar # ------------- sidebar <- dashboardSidebar(disable = FALSE, sidebarMenu( menuItem("Testing Tab", tabName="testing_tab", icon=icon("line-chart")), menuItem("Excel Input", tabName="excel_input", icon=icon('filter'), menuSubItem(icon = NULL, fileInput("upload", "Upload")) ) ) ) # setup dashboard body # -------------------- body <- dashboardBody( tabItems( tabItem(tabName = "testing_tab", column(width = 12, tableOutput('testing_01') ) ) ) ) # setup dashboard header & tie three components together # ------------------------------------------------------ header <- dashboardHeader(title = "Testing") myUI <- dashboardPage(header, sidebar, body) # setup server # ------------ mySERVER <- function(input, output, session) { output$testing_01 <- renderTable({ req(input$upload) test_01 <- read.csv(input$upload$datapath) %>% clean_names() %>% # 用lubridate的mdy转换日期,自动识别mm/dd/yyyy格式 mutate(day = mdy(day), # 提取月份(数字或标签)和年份 month_num = month(day), # 数字格式月份(1-12) month_name = month(day, label = TRUE), # 英文月份名称(Jan-Dec) year = year(day)) # 四位年份 }) } # deploy app # ---------- shinyApp( ui = myUI, server = mySERVER )
额外说明
- 若坚持用
as.Date,只需修改格式符:mutate(day = as.Date(day, format = '%m/%d/%Y')) - 若改用
readr::read_csv替代base的read.csv,可以在导入时直接指定列类型,避免后续转换:test_01 <- read_csv(input$upload$datapath, col_types = cols(day = col_date(format = "%m/%d/%Y"))) %>% clean_names()
内容的提问来源于stack exchange,提问作者Rich Viebrock
相关产品推荐
相关产品推荐

