You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改点说明

  1. 移除了format()函数,让data$date保留POSIXct类型,确保cut(date, "1 hour")能正确调用cut.POSIXct进行时间分组。
  2. 新增了可选的时间格式化步骤:聚合完成后,把分组后的时间列转成你需要的字符串格式,既满足分组需求,又能让表格显示美观。

内容的提问来源于stack exchange,提问作者TichPi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:29:28