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?

22
demandé sur barerd 2013-04-26 01:44:30

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"
    )
  )
))
23
répondu Mark Heckmann 2013-06-22 12:48:50

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.

10
répondu bokov 2013-06-21 03:35:48