R Shiny中使用cut.POSIXct报错‘x必须为数值型’的原因及解决
解决R Shiny中使用
cut.POSIXct时的‘x must be numeric’报错 报错原因分析
你遇到的问题根源很清晰:
- 代码里的
data$date<-format(as.POSIXct(data$date,"%Y/%m/%d %H:%M:%S"),"%Y/%m/%d %H:%M:%S")这一步,把刚转成的POSIXct时间对象又转成了字符型字符串。 cut()函数处理时间分组时,必须接收POSIXct/POSIXlt类型的时间对象,而字符串属于字符型,无法被按时间间隔切割——底层原因是时间类型本质是数值型的时间戳,字符串不具备这个属性,因此抛出了‘x must be numeric’的错误。
解决方法
只需要让date列保持POSIXct类型,别用format()转成字符串。如果需要格式化显示最终的时间,在聚合完成后再处理就行。
修改后的完整代码
library(shiny) library(readxl) ui <- fluidPage(titlePanel("Calculation of 1h Data"), sidebarLayout( sidebarPanel( fileInput("file", label = h3("File input")) ), mainPanel(tableOutput("table")) ) ) server <- function(input, output) { options(shiny.maxRequestSize=30*1024^2) selectedData <- reactive({ inFile <- input$file if (is.null(inFile)) return(NULL) data <- read_xlsx(inFile$datapath, col_names = TRUE,na = "") # 仅转换为POSIXct类型,不做format字符串转换 data$date <- as.POSIXct(data$date, format = "%Y/%m/%d %H:%M:%S") # 此时cut能正确识别时间对象,调用cut.POSIXct完成小时分组 datat <- aggregate(. ~ cut(date, "1 hour"), data, mean) # 可选:如果需要格式化显示时间列,添加这一步 datat[, 1] <- format(as.POSIXct(datat[, 1]), "%Y/%m/%d %H:%M:%S") datat }) output$table <- renderTable({ selectedData()}) } shinyApp(ui, server)
关键修改点说明
- 移除了
format()函数,让data$date保留POSIXct类型,确保cut(date, "1 hour")能正确调用cut.POSIXct进行时间分组。 - 新增了可选的时间格式化步骤:聚合完成后,把分组后的时间列转成你需要的字符串格式,既满足分组需求,又能让表格显示美观。
内容的提问来源于stack exchange,提问作者TichPi
相关产品推荐
相关产品推荐

