SideBar 和 TabItems 中的不同 tabName

Different tabName in SideBar and TabItems

在我的 shinydashboard 应用程序中,我想在 sidebarMenu 中指定一个与 body 中的 tabName 不同的 tabName。然后,服务器函数应在单击时捕获 tabName 并调用 updateTabItems

想法是,侧边栏中的一些菜单项应该转到同一个选项卡,侧边栏中较长的 tabName 包含用于填充选项卡的附加信息。

当 sideBar 和 tabItems 中的 tabNames 相同时,代码有效。但是,如果我更改侧边栏中的 tabName,例如到 one_param_valupdateTabItems 停止工作。

知道这是为什么吗?我能做些什么?

library(shiny)
library(shinydashboard)

ui <- shinydashboardPlus::dashboardPage(
    header=shinydashboard::dashboardHeader(title = "Switch tabs"),
    sidebar=shinydashboard::dashboardSidebar(
        shinydashboard::sidebarMenu(id = "tabs",
            shinydashboard::menuItem(
                "Menu Item 1", tabName = "one_param_val" # works for tabName="one"
            ),
            shinydashboard::menuItem(
                "Menu Item 2", tabName = "two"
            )
        )
    ),
    body=shinydashboard::dashboardBody(
        shinydashboard::tabItems(
            shinydashboard::tabItem(
                tabName = "one", h2("Content One")
            ),
            shinydashboard::tabItem(
                tabName = "two", h2("Content Two")
            )
        )   
    )
)

server <- function(input, output, session) {
    shiny::observeEvent(input$tabs, {
        if(grepl("^one", input$tabs)) {
            message("switching to one")
            shinydashboard::updateTabItems(
                session, inputId="tabs", selected="one"
            )
        }
    })
}

shinyApp(ui, server)

这是使用 hidden menuItem 的解决方法。但是,代理 menuItem 将不再在边栏中标记为已选中:

library(shiny)
library(shinyjs)
library(shinydashboard)

ui <- shinydashboardPlus::dashboardPage(
  header=shinydashboard::dashboardHeader(title = "Switch tabs"),
  sidebar=shinydashboard::dashboardSidebar(
    shinydashboard::sidebarMenu(id = "tabs",
                                shinyjs::hidden(shinydashboard::menuItem(
                                  "Menu Item 1", tabName = "one"
                                )),
                                shinydashboard::menuItem(
                                  "Menu Item 1", tabName = "one_param_val"
                                ),
                                shinydashboard::menuItem(
                                  "Menu Item 2", tabName = "two"
                                )
    )
  ),
  body=shinydashboard::dashboardBody(
    useShinyjs(),
    shinydashboard::tabItems(
      shinydashboard::tabItem(
        tabName = "one", h2("Content One")
      ),
      shinydashboard::tabItem(
        tabName = "two", h2("Content Two")
      )
    )   
  )
)

server <- function(input, output, session) {
  shiny::observeEvent(input$tabs, {
    # browser()
    if(grepl("^one", input$tabs)) {
      message("switching to one")
      shinydashboard::updateTabItems(
        session, inputId="tabs", selected="one"
      )
    }
  })
}

shinyApp(ui, server)