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

Shiny中使用sliderTextInput按日期过滤出现charToDate错误

解决Shiny中sliderTextInput结合yearmon日期过滤报错问题

问题根源

Shiny的输入控件会把sliderTextInput里的choices(哪怕你传入的是yearmon对象)转成字符串格式传到server端,不会保留原yearmon对象类型。比如你选的"2007-2-1"对应的yearmon会变成类似"Feb 2007"的字符串,直接用as.Date()解析这种非标准日期字符串,就会触发charToDate()的格式报错。

而你在Shiny外测试时,直接用as.yearmon()生成的是原生yearmon对象,as.Date()能正确处理,但到了Shiny里拿到的是字符串,原来的逻辑自然失效。

修复方案

在server端,先把输入的字符串转回yearmon对象,再转成Date类型做过滤:

server <- function(input, output, session) {
  output$show_dates <- renderTable({
    # 先转yearmon再转Date
    start_date <- as.Date(as.yearmon(input$select_dates[1]))
    df %>% filter(date >= start_date)
  })
}

完整可运行代码

library(shiny)
library(tidyverse)
library(zoo)
library(shinyWidgets)

df <- tibble(a = 1:3, 
             date = as.Date(c("2007-1-1", "2007-2-1", "2007-3-1"))
             )

ui <- fluidPage(
  shinyWidgets::sliderTextInput("select_dates", NULL,
                                choices = as.yearmon(df$date),
                                selected = as.yearmon(c("2007-1-1", 
                                                        "2007-2-1")),
                                animate = TRUE,
                                grid = FALSE,
                                dragRange = TRUE),
  tableOutput("show_dates")
)

server <- function(input, output, session) {
  output$show_dates <- renderTable({
    start_date <- as.Date(as.yearmon(input$select_dates[1]))
    df %>% filter(date >= start_date)
  })
}

shinyApp(ui = ui, server = server)

扩展:处理日期范围两端

如果要同时用滑块的起始和结束值过滤,逻辑一样:

server <- function(input, output, session) {
  output$show_dates <- renderTable({
    start_date <- as.Date(as.yearmon(input$select_dates[1]))
    end_date <- as.Date(as.yearmon(input$select_dates[2]))
    df %>% filter(date >= start_date, date <= end_date)
  })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:33:27