Are tabs with their own sidebars and mainPanels possible in shiny?

barerd picture barerd · Apr 25, 2013 · Viewed 11.4k times · Source

I would like to display different inputs for different tabs. So I tried to build a page with several tabPanels. However, I can't have sth like below:

library(shiny)

shinyUI(pageWithSidebar(
  headerPanel("Header"),

  tabsetPanel(
    tabPanel(
      headerPanel("Tab 1"),
      sidebarPanel(
        selectInput("var", "Parametre", choices = c("1", "2", "3"))
        ),
      mainPanel(
        textOutput("text1")
        )
      ),
    tabPanel(
      headerPanel("Tab 2"),
      sidebarPanel(
        selectInput("var", "Parametre", choices = c("21", "22", "23"))
      ),
      mainPanel(
        textOutput("text2")
      )
    )
    )
  ))

I suspect that the pageWithSidebar is causing the problem, but I couldn't find an alternative in google groups. Is there a way to display several tabs with their own sidebars and mainPanels, or shall I create different apps for this purpose?

Answer

Mark Heckmann picture Mark Heckmann · Jun 22, 2013

If I do not misunderstand your question, I think you can even evade the jQuery part (from @f1r3br4nd answer) by supplying an id for the tabsetPanel function, here id = "conditionedPanels". The value parameter (i.e. which tab is selected in the main panel) is then available via the input variable.

A minmal example: server.R may be empty except for the shinyServer function skeleton. The ui.R file might be as follows.

shinyUI(pageWithSidebar(
  headerPanel("Conditional Panels"),
  sidebarPanel(
    conditionalPanel(condition="input.conditionedPanels==1",
                     helpText("Content Panel 1")
    ),
    conditionalPanel(condition="input.conditionedPanels==2",
                     helpText("Content Panel 2")
    ) 
  ),
  mainPanel(
    tabsetPanel(
      tabPanel("Panel 1", value=1), 
      tabPanel("Panel 2", value=2)
      , id = "conditionedPanels"
    )
  )
))