R Shiny中selectizeGroupUI联动筛选时日期范围变更导致其他选择器重置为空的问题求助
R Shiny中selectizeGroupUI联动筛选时日期范围变更导致其他选择器重置为空的问题求助
我最近在开发Shiny应用时碰到了一个棘手的问题:我使用selectizeGroupUI实现了筛选器之间的联动,一开始各个选择器的依赖逻辑都正常运行,但每当我调整dateRangeInput的日期范围后,CATEGORY和SOURCE这两个选择器就会重置为空状态,之前选好的筛选条件都丢失了。
我已经查找过一些讨论同类问题的内容,但不太明确如何将那些解决方案适配到我的代码中。下面是我的完整代码以及测试数据,希望能得到大家的帮助:
完整Shiny代码
library(shiny) library(shinyWidgets) library(plotly) library(dplyr) library(magrittr) library(DT) library(lubridate) library(tidyr) ui <- fluidPage( fluidRow( column( width = 10, offset = 1, tags$h3("Filter data with selectize group"), panel(dateRangeInput("date_range", label = "Date range:", start = min(df_new$DATE), end = max(df_new$DATE), min = min(df_new$DATE), max = max(df_new$DATE), format = "yyyy-mm-dd", startview = "year", separator = " to "), selectizeGroupUI( id = "my-filters", params = list( CATEGORY = list(inputId = "CATEGORY", title = "CATEGORY:"), SOURCE = list(inputId = "SOURCE", title = "SOURCE:") ) ), status = "primary" ), plotlyOutput("plot"), DT::dataTableOutput(outputId = "table") ) ) ) server <- function(input, output, session) { dates_filter <- reactive({ filter(df_new, DATE >= input$date_range[1] & DATE <= input$date_range[2]) }) res_mod <- callModule( module = selectizeGroupServer, id = "my-filters", data = dates_filter, vars = c("CATEGORY", "SOURCE") ) dat <- reactive({ req(res_mod()) res_mod() %>% group_by(YEAR,DATE, MONTH, WEEK, WEEKDAYS) %>% summarise(Revenue_now = sum(REVENUE_2018), Revenue_pre = sum(REVENUE_2017)) %>% group_by(YEAR) %>% mutate(Revenue_now_cum = cumsum(Revenue_now), Revenue_pre_cum = cumsum(Revenue_pre)) }) output$table <- DT::renderDataTable({ req(dat()) dat() }) output$plot <- renderPlotly({ plot_ly( dat(), x = ~ DATE, y = ~ as.numeric(Revenue_now_cum), type = 'scatter', mode = 'lines+markers', name = "Selected year" ) %>% add_trace(y = ~ as.numeric(Revenue_pre_cum), mode = 'lines+markers', name = "Previous year" ) %>% layout(xaxis = list(type="category")) }) } shinyApp(ui, server)
测试数据代码
range_dates<-seq(as.Date('2017/01/01'), as.Date('2018/11/17'), by = "day") DATE = rep(range_dates, 10) CATEGORY = rep(sample(c("A","B","C"),10,T), each = length(range_dates)) SOURCE = rep(sample(c("aa","bb","cc"),10,T), each = length(range_dates)) REVENUE = as.numeric(sample(c(100:20000), length(range_dates) * 10, replace = T)) YEAR = year(DATE) MONTH = months(DATE) WEEKDAYS = weekdays(DATE) WEEK = isoweek(DATE) df <- data.frame(DATE, YEAR, MONTH, WEEK, WEEKDAYS, CATEGORY, SOURCE, REVENUE) df_new<-df %>% group_by(YEAR) %>% mutate(row = row_number()) %>% tidyr::pivot_wider(names_from = YEAR, values_from = REVENUE, names_glue = "{.value}_{YEAR}") %>% select(-row) df_new$YEAR = year(df_new$DATE) year(df_new$DATE)<-2018
备注:内容来源于stack exchange,提问作者Zizou
相关产品推荐
相关产品推荐

