R Shiny如何在renderUI中更新selectInput实现分类级联筛选
核心问题
- 原代码中子分类下拉框未绑定分类选择的变化监听,无法动态更新可选值
- 分类、子分类的下拉选项未做去重,会出现大量重复选项
- 筛选逻辑中使用了不存在的
TODOS判断值,和实际定义的ALL选项不匹配 - 使用了已废弃的
filter_函数,易引发兼容性报错
修改后可直接运行的完整代码
library(shiny) library(tidyverse) library(DT) cat1<-rep("LINEA BLANCA", 75) cat2<- rep("VIDEO", 75) subcat1<-rep("LAVADORAS", 40) subcat2<- rep("REFRIS", 35) subcat3<- rep("TV", 40) subcat4<- rep("SONIDO", 35) vent<-sample(100:900, 150, replace=T) segm1<-rep("AAA", 25) segm2<-rep("BBB", 25) segm3<-rep("CCC", 25) segm4<-rep("ABB", 25) segm5<-rep("ACC", 25) segm6<-rep("BAC", 25) db<- tibble(segment=c(segm1,segm2,segm3,segm4,segm5, segm1),CATEGORIA=c(cat1,cat2), SUBCAT=c(subcat1,subcat2, subcat3, subcat4), vent=vent) ui <- fluidPage( titlePanel("EXAMPLE"), sidebarLayout( sidebarPanel(), mainPanel( tabsetPanel(type = "tabs", tabPanel("Ana_inv", uiOutput("selectcat"), uiOutput("selectsubcat"),DT::dataTableOutput("ana_inv")), tabPanel("Table", tableOutput("table")) ) ) ) ) server <- function(input, output, session) { output$selectcat <- renderUI({ # 分类选项去重 selectInput("Cat", "Seleccione Categoria", choices = c("ALL",unique(db$CATEGORIA))) }) output$selectsubcat <- renderUI({ # 监听分类选项变化,动态生成子分类选项 req(input$Cat) if(input$Cat == "ALL"){ sub_choices <- unique(db$SUBCAT) }else{ sub_choices <- db %>% filter(CATEGORIA == input$Cat) %>% pull(SUBCAT) %>% unique() } selectInput("Subcat", "Seleccione Subcategoria", choices = c("ALL",sub_choices)) }) activar<- reactive({ req(input$Cat, input$Subcat) # 简化筛选逻辑,废弃原quote+filter_写法 filtered_db <- db if(input$Cat != "ALL"){ filtered_db <- filtered_db %>% filter(CATEGORIA == input$Cat) } if(input$Subcat != "ALL"){ filtered_db <- filtered_db %>% filter(SUBCAT == input$Subcat) } filtered_db %>% group_by(segment)%>% summarise(SKUs=n(), vta=sum(vent)) }) output$ana_inv <- DT::renderDataTable({ activar() }) } shinyApp(ui = ui, server = server)
关键修改说明
- 给子分类的
renderUI添加req(input$Cat)依赖,分类选择变化时会自动触发子分类下拉框重新渲染,实现选项联动 - 所有下拉选项新增
unique()去重,避免出现大量重复可选值 - 简化筛选逻辑,直接通过条件判断逐层过滤数据,兼容所有
ALL选择场景,符合「分类选ALL时可单独用子分类筛选」的需求
内容的提问来源于stack exchange,提问作者Manuel Vásquez
相关产品推荐
相关产品推荐

