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?
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"
)
)
))
I got mine to work by having only one sidebarPanel
like in the Shiny example apps but then wrapping stuff in the sidebarPanel
that's only for specific tabs in separate conditionalPanel
calls as here. The trick is then to make the character string that is conditionalPanel
's condition argument be a jQuery statement that looks at the html
attribute of the currently selected tab and ===
s it to the name of the tab for which this content should appear in the sidebar:
conditionalPanel(
"$('li.active a').first().html()==='Foo'",
actionButton("bar","Bar"));
...where Foo
is the title of the tab.
In short, one sidebar but its content conditional on active tab.
I know this is an old post but I stumbled across it when I was looking for an answer to a similar question. I think you can also accomplish what you want by using a fluidPage
(instead of pageWithSidebar
) and then using the sidebarLayout
function in each of the tabPanels
.
An example:
library(shiny)
ui <- fluidPage(
headerPanel("Header"),
tabsetPanel(
tabPanel('Tab 1',
sidebarLayout(
sidebarPanel(
selectInput("var", "Parametre", choices = c("1", "2", "3"))
),
mainPanel(
textOutput("text1")
)
)
),
tabPanel('Tab 2',
sidebarLayout(
sidebarPanel(
selectInput("var", "Parametre", choices = c("21", "22", "23"))
),
mainPanel(
textOutput("text2")
)
)
)
)
)
server <- function(input, output) {}
shinyApp(ui, server)