如何在Shiny中仅为部分选项组定义名称?
解决Shiny下拉菜单部分分组隐藏组名的问题
要实现部分分组不显示组名的需求,有两种可行方案:
方案一:修改selectInput生成的标签
利用htmltools的tagQuery定位目标分组,将其组名设为空字符串即可隐藏:
library(shiny) library(htmltools) grouped_options <- list( "Named category 1" = list("list_choice1"), # 标记为需要隐藏组名的分组 "NONAME" = list("Use all data", "list_choice3"), "Named category 2" = list("list_choice5", "list_choice6") ) # 生成原始下拉菜单 dropdown_element <- selectInput( inputId = "dd1", label = "Dropdown menu with categorised options", choices = grouped_options ) # 定位并修改目标optgroup dropdown_element <- tagQuery(dropdown_element) %>% find("optgroup[label='NONAME']") %>% attr("label", "") %>% allTags() ui <- fluidPage( h1("Demo dropdown with categories"), dropdown_element, textOutput("sel_choice") ) server <- function(input, output, session) { output$sel_choice <- renderText(input$dd1) } shinyApp(ui, server)
原理:selectInput会为每个列表项生成带label属性的optgroup标签,通过tagQuery找到标记为NONAME的分组,将其label设为空,浏览器就不会显示该组的名称,同时保留分组的缩进样式。
方案二:手动构建HTML下拉菜单
如果需要更精准的控制,直接用Shiny的HTML标签手动构建下拉菜单,完全自定义每个分组的显示:
library(shiny) ui <- fluidPage( h1("Demo dropdown with categories"), # 对应selectInput的label tags$label("Dropdown menu with categorised options", `for` = "dd1"), tags$select( id = "dd1", # 无名称的分组,label设为空 tags$optgroup( label = "", tags$option("Use all data", value = "Use all data"), tags$option("list_choice3", value = "list_choice3") ), # 正常显示的分组1 tags$optgroup( label = "Named category 1", tags$option("list_choice1", value = "list_choice1") ), # 正常显示的分组2 tags$optgroup( label = "Named category 2", tags$option("list_choice5", value = "list_choice5"), tags$option("list_choice6", value = "list_choice6") ) ), textOutput("sel_choice") ) server <- function(input, output, session) { output$sel_choice <- renderText(input$dd1) } shinyApp(ui, server)
这种方式不需要依赖selectInput的自动生成逻辑,完全由你控制每个分组的结构和样式,适合复杂的自定义场景。
内容的提问来源于stack exchange,提问作者mkranj
相关产品推荐
相关产品推荐

