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

如何为RShiny应用实现带子选项的分组复选框UI?

实现分组复选框的RShiny时间序列应用

完全可以基于你现有的DataFrame实现分组复选框的需求,核心思路是先拆分列名提取变量类型和子区域信息,再在UI中按变量类型分组展示对应区域的复选框,最后在服务器端收集所有选中的列进行绘图。以下是完整的实现方案:

1. 准备示例数据(模拟你的Both DataFrame)

假设你的列名格式为[变量类型]_[区域](如SST_anomaly_GOM),先构造模拟数据:

library(shiny)
library(ggplot2)
library(tidyr)
library(dplyr)

# 模拟时间序列数据
set.seed(123)
dates <- seq.Date(as.Date("2020-01-01"), as.Date("2023-12-31"), by = "month")
Both <- data.frame(
  Date = dates,
  SST_anomaly_GOM = rnorm(length(dates)),
  SST_anomaly_GB = rnorm(length(dates)),
  SST_anomaly_MAB = rnorm(length(dates)),
  BT_anomaly_GOM = rnorm(length(dates)),
  BT_anomaly_GB = rnorm(length(dates)),
  Chl_anomaly_MAB = rnorm(length(dates))
)

2. 拆分列名并生成分组信息

通过正则表达式拆分列名,提取变量类型(如SST_anomaly)和对应子区域(如GOM):

# 处理列名,生成变量-区域映射
col_info <- tibble(col_name = colnames(Both)[-1]) %>%
  mutate(
    # 按最后一个下划线拆分,前半部分为变量类型,后半为区域
    var_type = sub("_(.*)$", "", col_name),
    region = sub(".*_", "", col_name)
  ) %>%
  group_by(var_type) %>%
  summarise(regions = list(region), cols = list(col_name)) %>%
  ungroup()

3. 修改UI:按变量类型分组展示复选框

采用Shiny原生的accordion组件(需Shiny≥1.6.0)创建折叠分组,每个分组下展示对应区域的复选框:

ui <- fluidPage(
  titlePanel("分组变量选择时间序列"),
  
  # 折叠式分组复选框
  accordion(
    id = "var_groups",
    !!!purrr::map(seq(nrow(col_info)), function(i) {
      accordion_panel(
        title = col_info$var_type[i],
        checkboxGroupInput(
          inputId = paste0("chk_", col_info$var_type[i]),
          label = NULL,
          choices = setNames(col_info$cols[[i]], col_info$regions[[i]])
        )
      )
    })
  ),
  
  plotOutput("ts_plot")
)

如果你的Shiny版本较低,可替换为平铺分组(用标题分隔):

# 兼容低版本Shiny的平铺分组UI
ui <- fluidPage(
  titlePanel("分组变量选择时间序列"),
  
  lapply(seq(nrow(col_info)), function(i) {
    tags$div(
      tags$h3(col_info$var_type[i]),
      checkboxGroupInput(
        inputId = paste0("chk_", col_info$var_type[i]),
        label = NULL,
        choices = setNames(col_info$cols[[i]], col_info$regions[[i]])
      ),
      style = "margin-bottom: 20px; border-bottom: 1px solid #eee; padding-bottom: 10px;"
    )
  }),
  
  plotOutput("ts_plot")
)

4. 服务器端逻辑:收集选中列并绘图

遍历所有分组的复选框输入,合并选中的列名后处理绘图:

server <- function(input, output) {
  # 响应式收集所有选中的列
  selected_cols <- reactive({
    # 获取每个变量分组的复选框输入
    chk_inputs <- lapply(col_info$var_type, function(vt) {
      input[[paste0("chk_", vt)]]
    })
    # 过滤空值并合并
    unlist(chk_inputs) %>%
      purrr::discard(is.null)
  })
  
  # 整理选中的数据
  selected_data <- reactive({
    req(selected_cols())
    Both[, c("Date", selected_cols())]
  })
  
  # 绘制时间序列图
  output$ts_plot <- renderPlot({
    req(selected_data())
    selected_data() %>%
      pivot_longer(-Date, names_to = "Variable", values_to = "Value") %>%
      ggplot(aes(x = Date, y = Value, color = Variable)) +
      geom_line(linewidth = 1) +
      labs(x = "日期", y = "异常值", color = "变量-区域") +
      theme_minimal() +
      theme(legend.position = "bottom")
  })
}

shinyApp(ui, server)

关键说明

  • 列名适配:如果你的列名格式不是[变量类型]_[区域],只需调整mutate中的正则表达式即可(比如列名是GOM_SST_anomaly,就把拆分逻辑反过来)。
  • 交互优化:折叠面板可以大幅减少界面占用空间,用户可按需展开/收起对应变量类型的选项。
  • 兼容性:低版本Shiny可使用平铺分组方案,同样能实现分类效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:35:13