选择不同的 tabItem 时,Shiny dashboardSidebar 会发生变化

Shiny dashboardSidebar change when different tabItem selected

我遇到了以下问题:

我想要在 tabItem 之间切换时更改边栏。

dashboardPage(
dasboardHeader(title = ""),
dashboardSidebar(
  sidebarMenu(
    menuItem("1", tabName = "1"),
    menuItem("2", tabName = "2")     
             ),
#I want this to be displayed when menuItem "1" is clicked
      tabsetPanel(
            tabPanel("t1", val="t1",
                    .... some inputs),
            tabPanel("t2", val="t2",
                    .... some inputs)
                 ),
 # This to be displayed when menuItem "2" is clicked    
      selectInput("s1", label="Select"....),
      selectInput("s2", label="Select2"...)
  )
dashboardBody(
 tabItem(tabName="1", 
      .......
   ),
 tabItem(tabName="2",
      ........
   )
 )
)

我在选项卡之间切换时更改了 dashboardBody,但不知道如何更改 dashboardSidebar 值。在 dashboardSidebar 中试过这个:

 conditionalPanel(
             condition="tabName='1'",
          #displaying first version of DashboardSidebar
             ),
 conditionalPanel(
             condition="tabName='2'",
          #displaying second version of DashboardSidebar
             )

但它对我不起作用。

有什么想法吗?

感谢您的帮助。

首先,您必须添加 sidebarMenu 一个用于 Shiny 输入值的 ID,它会报告选择了哪个选项卡。

之后,将uiOutput添加到dashboardSidebar函数中。

uiOutput 将根据所选选项卡接收 tabsetPanel 或两个 selectInput

最后,在您在服务器端定义的 renderUI 中,您只需要创建条件语句。这是简单的部分。

棘手的部分是您必须将 selectInput 包装到一个列表中 - 否则只有第二个小部件会被发送到 UI。更棘手的部分是,当你想通过 renderUI 将它发送到 UI 时,你必须指定 tabsetPanelID。 (这非常棘手,因为通常您不必指定其 ID!)


完整示例:

library(shiny)
library(shinydashboard)
rm(ui)
rm(server)

ui <- dashboardPage(
    dashboardHeader(title = ""),
    dashboardSidebar(

    # added ID which will be used for a Shiny input value,
    # and it will report which tab is selected.
    sidebarMenu(id = "tab", 
      menuItem("1", tabName = "1"),
      menuItem("2", tabName = "2")
    ),
    uiOutput("out1")
    ),
    dashboardBody(
      tabItem(tabName = "1"),
      tabItem(tabName = "2")
    )
)

server <- function(input, output) {


  output$out1 <- renderUI({

    if (input$tab == "1") {

      dyn_ui <- tabsetPanel(id = "tabset_id", selected = "t1", 
                            tabPanel("t1", value = "t1"),
                            tabPanel("t2", value = "t2"))

    } 
    if (input$tab == "2") {

      dyn_ui <- list(selectInput("s1", label = "Select", choices = letters[1:3]),
                     selectInput("s2", label = "Select2", choices = letters[4:6]))
    }
    return(dyn_ui)
  })
}

shinyApp(ui, server)