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

如何在Shiny应用中实现基于选中Dataframe动态更新SelectInput选项?

解决Shiny应用中动态更新筛选选项的问题

你的需求是切换不同数据集后,让筛选用的selectizeInput自动显示当前数据集的可用选项,同时用该选项筛选表格。下面是修正后的完整代码,以及关键修改说明:

完整修正代码

library(dplyr)
library(shinydashboard)
library(shiny)
library(DT)

ui <- dashboardPage(
  dashboardHeader(title = "Planejamento de compras"),
  dashboardSidebar(
    sidebarMenu(
      radioButtons(
        inputId = "cronograma", 
        label = "Qual ano deseja pesquisar?",  
        choices = c("Cronograma_2022", "Cronograma_2023"), 
        selected = "Cronograma_2023"
      ),
      selectizeInput(
        inputId = "setor", 
        label = "Selecione o setor:", 
        choices = NULL, 
        multiple = TRUE
      )
    )
  ),
  dashboardBody(
    fluidRow(
      box(DT::DTOutput("table"))
    )
  )
)

server <- function(input, output, session) {
  # 获取选中年份的原始数据集
  raw_data <- reactive({
    if(input$cronograma == "Cronograma_2022"){ 
      iris %>% filter(Species %in% c("setosa", "versicolor"))
    } else {
      iris %>% filter(Species %in% c("virginica", "versicolor"))
    }
  })
  
  # 监听数据集变化,动态更新筛选选项
  observeEvent(raw_data(), {
    updateSelectizeInput(
      session, 
      "setor", 
      choices = sort(unique(raw_data()$Species)),
      server = TRUE
    )
  })
  
  # 根据筛选选项处理数据
  filtered_data <- reactive({
    req(input$setor) # 确保用户选择了选项再执行筛选
    raw_data() %>% filter(Species %in% input$setor)
  })
  
  # 渲染筛选后的表格
  output$table <- DT::renderDT(filtered_data())
}   

shinyApp(ui, server)

关键修改说明

  • 拆分数据逻辑:把「获取原始数据集」和「应用筛选」拆成两个reactive对象,避免重复计算,逻辑更清晰。
  • 动态更新选项:用observeEvent监听raw_data的变化,每当切换年份导致数据集更新时,自动提取当前数据集的Species唯一值,更新selectizeInput的选项。
  • 避免空值报错:用req(input$setor)确保只有用户选择了筛选选项后,才执行筛选逻辑,防止空输入导致的错误。
  • 修正语法问题:去掉了原代码中无效的break语句,改用dplyr::filter替代原生索引,代码可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:20:02