如何在Shiny应用中设置仅选择dateRange区间日期后才生成表格?
解决方法
你当前的代码问题在于:仅通过JS修改了前端输入框的显示文本,实际Shiny后台的input$daterange1还是绑定了初始化时设置的起止日期默认值,所以req(input$daterange1)会直接判定校验通过,页面加载就会生成表格。
只需要调整两个地方即可实现需求:
- 初始化
dateRangeInput时,将start、end参数设置为NA,让初始状态下input$daterange1返回空值 - 强化响应式数据的校验规则,仅当两个日期都被用户选中后才执行数据筛选
修改后的完整可运行代码如下:
library(shiny) library(shinythemes) library(dplyr) Test <- structure(list(date2 = structure(c(18808, 18808, 18809, 18810 ), class = "Date"), Category = c("FDE", "ABC", "FDE", "ABC"), coef = c(4, 1, 6, 1)), row.names = c(NA, 4L), class = "data.frame") ui <- fluidPage( shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE, br(), tabPanel("", sidebarLayout( sidebarPanel( uiOutput('daterange'), br() ), mainPanel( dataTableOutput('table'), br(), br(), downloadButton("dl", "Download") ), )) )) server <- function(input, output,session) { data <- reactive(Test) output$daterange <- renderUI({ tagList(dateRangeInput("daterange1", "Period you want to see:", start = NA, end = NA, min = min(data()$date2), max = max(data()$date2), tags$script(HTML(' setTimeout(function(){ $("#daterange1 input")[0].value = "No date selected"; $("#daterange1 input")[1].value = "No date selected"; }, 50); ')))) }) data_subset <- reactive({ # 强化校验:必须两个日期都被选中才继续执行 req(input$daterange1, !is.na(input$daterange1[1]), !is.na(input$daterange1[2])) days <- seq(input$daterange1[1], input$daterange1[2], by = 'day') subset(data(), date2 %in% days) }) output$table <- renderDataTable({ # 可选:添加友好提示,未选日期时显示提示文本 validate(need(nrow(data_subset())>0, "请选择日期范围以查看数据")) data_subset() }) output$dl <- downloadHandler( filename = function() { "data.xlsx"}, content = function(file) { writexl::write_xlsx(data_subset(), path = file) } ) } shinyApp(ui = ui, server = server)
如果不需要选中前的提示文本,删掉validate那一行即可,未选日期时表格区域会保持空白。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

