如何在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
相关产品推荐
相关产品推荐

