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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:39:02