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

R Shiny中pickerInput多选项单值提取及分别筛选数据的实现问题

R Shiny pickerInput多值提取与分年份数据筛选实现方案

一、原有代码问题定位

  • UI语法错误:verbatimTextOutput("year2")语句末尾遗漏逗号,导致页面组件解析失败
  • 配置冲突:max-options = 4限制最多选4个年份,但默认选中了5个值,pickerInput初始化时会自动清空不符合规则的默认选中项,导致初始状态下input$testPicker为空,索引取值无返回结果

二、修复后的基础验证代码

运行后可正常打印选中的各个年份值:

library(shiny)
library(shinyWidgets)
library(dplyr)

ui <- fluidPage(
  pickerInput(inputId = "testPicker",
              label = "Select Multiple",
              choices = c(2021, 2020,2019,2018,2017),
              # 默认选中4个符合max-options规则的值
              selected = c(2021, 2020,2019,2018),
              multiple = TRUE,
              options = list(
                `actions-box` = TRUE,
                "max-options" = 4,
                "max-options-text" = "You can ONLY select 4 years!"
              )),
  verbatimTextOutput("year1"),
  verbatimTextOutput("year2"),
  verbatimTextOutput("year3")
)

server <- function(input, output, session) {
  # 加req判断避免空值报错
  output$year1 <- renderPrint(req(input$testPicker[3]))
  output$year2 <- renderPrint(req(input$testPicker[2]))
  output$year3 <- renderPrint(req(input$testPicker[1]))
}

shinyApp(ui, server)

三、分年份生成数据框的实现方案

推荐用响应式列表统一存储各年份处理后的数据,调用时直接按索引或年份名称取值即可,示例代码如下:

library(shiny)
library(shinyWidgets)
library(dplyr)

# 提前读入数据,替换为你本地的文件路径即可
main_data <- read.csv("df.csv")

ui <- fluidPage(
  pickerInput(inputId = "testPicker",
              label = "选择年份(最多4个)",
              choices = c(2021, 2020,2019,2018,2017),
              selected = c(2021, 2020,2019,2018),
              multiple = TRUE,
              options = list(
                `actions-box` = TRUE,
                "max-options" = 4,
                "max-options-text" = "最多只能选择4个年份!"
              )),
  # 示例输出第一个选中年份的统计结果
  tableOutput("year1_result")
)

server <- function(input, output, session) {
  # 响应式列表:每个元素对应一个选中年份的统计数据框
  year_data <- reactive({
    req(input$testPicker)
    lapply(input$testPicker, function(y) {
      main_data %>%
        filter(Year == y) %>%
        group_by(LGA) %>%
        summarise("Total Students" = sum(`Class Student Count`, na.rm = TRUE)) %>%
        ungroup()
    }) %>% setNames(paste0("year_", input$testPicker)) # 按年份命名方便调用
  })
  
  # 调用示例:输出第一个选中年份的统计结果
  output$year1_result <- renderTable({
    year_data()[[1]]
    # 也可以按年份名称调用:year_data()[["year_2021"]]
  })
}

shinyApp(ui, server)

调用说明

  • 按索引取对应选中年份的数据:year_data()[[1]]对应第一个选中的年份、year_data()[[2]]对应第二个选中的年份,以此类推
  • 按年份名称取数据:year_data()[["year_2021"]]直接获取指定年份的统计结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:18:03