如何调整Shiny中daterange组件使其初始化为空、不自动加载表格
问题解决方法
根因说明
dateRangeInput组件未显式指定初始起止值时,默认会自动填充你配置的min、max日期作为初始值。由于你用renderUI动态生成该组件,不同数据集下输入值的初始化触发时机和响应式链路的执行顺序存在差异,才会出现部分数据集初始化自动触发表格加载的问题。
调整方案
只需要修改两处代码即可实现daterange初始化始终为空,不会自动触发表格加载:
- 第一处:给动态生成的
dateRangeInput显式传入start = NA, end = NA参数,强制初始化时输入框无默认值 - 第二处:给
data_subset的响应式判断新增校验,确保起止日期均不为空时才执行后续逻辑
完整修改后代码
library(shiny) library(shinythemes) # 可替换为任意测试数据集 Test <- structure(list(date2 = as.Date(c("2021-07-30","2021-07-30","2021-11-01","2021-11-02")), Category = c("FDE", "ABC", "FDE", "ABC"), coef = c(4, 1, 6, 1)), class = "data.frame",row.names = c(NA, -4L)) ui <- fluidPage( shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE, br(), tabPanel("", sidebarLayout( sidebarPanel( uiOutput('daterange'), br() ), mainPanel( dataTableOutput('table') ) )) )) server <- function(input, output,session) { data <- reactive(Test) output$daterange <- renderUI({ dateRangeInput("daterange1", "Period you want to see:", min = min(data()$date2), max = max(data()$date2), # 新增配置:强制初始化无默认值 start = NA, end = NA) }) data_subset <- reactive({ req(input$daterange1) # 新增校验:起止日期均不为空才执行后续逻辑 req(!is.na(input$daterange1[1]), !is.na(input$daterange1[2])) req(input$daterange1[1] <= input$daterange1[2]) days <- seq(input$daterange1[1], input$daterange1[2], by = 'day') subset(data(), date2 %in% days) }) output$table <- renderDataTable({ data_subset() }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

