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

Shiny侧边栏菜单:利用子菜单组织selectInput组件

实现Shiny仪表板子菜单嵌入输入组件的方案

你想要的是在Shiny仪表板侧边栏的子菜单中放置selectInput这类输入组件,点击子菜单展开时显示对应输入项,同时主体区域只保留一个仪表板页面对吧?我帮你完善了convertMenuItem函数,并给出完整的可运行代码:

关键函数与完整代码

首先是核心的convertMenuItem函数,它能让子菜单既保留展开/折叠功能,又能触发主体区域的输入组件切换:

convertMenuItem <- function(mi, tabName) {
  mi$children[[1]]$attribs['data-toggle'] = "tab"
  mi$children[[1]]$attribs['data-value'] = tabName
  # 保留树形菜单的展开功能,补全你代码中未完成的判断逻辑
  if (!is.null(mi$attribs$class) && "treeview" %in% mi$attribs$class) {
    mi$children[[1]]$attribs['data-toggle'] = "treeview"
  }
  mi
}

接下来是完整的Shiny应用代码:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(title = "子菜单输入组件示例"),
  dashboardSidebar(
    sidebarMenu(
      # 用convertMenuItem处理主菜单,嵌套需要的子菜单
      convertMenuItem(
        menuItem("数据筛选", icon = icon("filter"),
                 menuSubItem("选择数据集", tabName = "datasetTab"),
                 menuSubItem("选择变量", tabName = "variableTab")
        ),
        tabName = "mainTab"
      )
    )
  ),
  dashboardBody(
    tabItems(
      # 主体区域只保留一个主标签页
      tabItem(tabName = "mainTab",
              h2("主仪表板内容"),
              # 动态渲染对应子菜单的输入组件
              uiOutput("dynamicInputs")
      )
    )
  )
)

server <- function(input, output, session) {
  # 跟踪当前激活的子菜单标签
  currentActiveTab <- reactive({
    input$tabs
  })
  
  # 根据子菜单选择动态生成输入组件
  output$dynamicInputs <- renderUI({
    switch(currentActiveTab(),
           "datasetTab" = selectInput("dataset", "选择数据集:",
                                      choices = c("iris", "mtcars", "airquality")),
           "variableTab" = selectInput("variable", "选择变量:",
                                       choices = c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")),
           # 默认显示空内容
           NULL
    )
  })
}

shinyApp(ui, server)

实现逻辑说明

  • convertMenuItem:通过修改菜单的HTML属性,解决了子菜单既要展开又要触发内容切换的冲突——当菜单是树形菜单(带treeview类)时,保留它的展开功能,同时给子菜单项添加标签页切换的属性。
  • 侧边栏结构:主菜单用convertMenuItem包裹,里面的子菜单各自对应唯一的tabName,点击时会触发input$tabs的值变化。
  • 主体区域:只设置一个主标签页,通过uiOutput动态渲染输入组件,完全符合你“仅在主体区域设置一个仪表板页面”的需求。
  • 服务器端:监听input$tabs的变化,根据当前选中的子菜单,动态生成对应的selectInput组件。

这样运行后,你点击侧边栏的子菜单(红圈标记的展开区域)时,子菜单会展开,同时主体区域会显示对应的输入选择项,而主体始终保持在同一个页面中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:13:48