Les onglets avec leurs propres barres latérales et mainPanels sont-ils possibles dans shiny?
Je voudrais afficher différentes entrées pour différents onglets. J'ai donc essayé de construire une page avec plusieurs tabPanels. Cependant, je ne peux pas avoir sth comme ci-dessous:
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")
)
)
)
))
Je soupçonne que le pageWithSidebar
est à l'origine du problème, mais je n'ai pas pu trouver d'alternative dans google groups. Existe-t-il un moyen d'afficher plusieurs onglets avec leurs propres barres latérales et mainPanels, ou dois-je créer différentes applications à cet effet?
2 réponses
Si Je ne comprends pas mal votre question, je pense que vous pouvez même échapper à la partie jQuery (de la réponse @f1r3br4nd) en fournissant un id pour la fonction tabsetPanel
, ici id = "conditionedPanels"
. Le paramètre value
(c'est-à-dire quel onglet est sélectionné dans le panneau principal) est alors disponible via la variable input
.
Un exemple minmal: server.R
peut être vide à l'exception du squelette de la fonction shinyServer.
Le fichier ui.R
peut être le suivant.
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"
)
)
))
J'ai eu le mien à travailler en ayant un seul sidebarPanel
comme dans l'exemple Brillant apps mais alors, enveloppant les choses dans le sidebarPanel
c'est uniquement pour des onglets distincts conditionalPanel
appels ici. L'astuce consiste alors à faire en sorte que la chaîne de caractères qui est l'argument condition de conditionalPanel
soit une instruction jQuery qui regarde l'attribut html
de l'onglet actuellement sélectionné et ===
le renvoie au nom de l'onglet pour lequel ce contenu devrait apparaître dans la barre latérale:
conditionalPanel(
"$('li.active a').first().html()==='Foo'",
actionButton("bar","Bar"));
...où Foo
est le titre de l'onglet.
En bref, une barre latérale mais son contenu conditionnel à l'onglet actif.