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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:49:06