web-dev-qa-db-fra.com

R Shiny - ajouter dynamiquement tabPanel à tabsetPanel (avec l'utilisation de renderUI)

Je développe une application brillante dans laquelle j'utilise tabsetPanel, qui est générée lorsque l'utilisateur entre une entrée particulière. Ainsi, je veux utiliser la fonction renderUI pour faire apparaître/disparaître un tabsetPanel.

Mon problème est maintenant que nombretabPanel éléments (arguments de tabsetPanel) dépend également de l'entrée de l'utilisateur, de la manière: parfois je besoin d'un 1, d'autres fois je veux plus tabPanels.

Comment le faire? J'ai essayé d'inclure conditionPanel ou d'inclure une condition simple if()... dans l'argument tabsetPanel, mais cela (plutôt sans surprise ...) n'a pas fonctionné.

44
Marta Karas

Voici. Le code est assez explicite.

library(shiny)
runApp(list(
  ui = pageWithSidebar(
    headerPanel('Dynamic Tabs'),
    sidebarPanel(
      numericInput("nTabs", 'No. of Tabs', 5)
    ),
    mainPanel(
      uiOutput('mytabs')  
    )
  ),
  server = function(input, output, session){
    output$mytabs = renderUI({
      nTabs = input$nTabs
      myTabs = lapply(paste('Tab', 1: nTabs), tabPanel)
      do.call(tabsetPanel, myTabs)
    })
  }
))
71
Ramnath

Il existe un moyen d'ajouter dynamiquement des tabPanels sans renderUI, ce qui n'est peut-être pas aussi évident que la version avec renderUI. J'ai écrit une fonction addTabToTabset qui ajoutera tout (liste de) tabPanel (s) à un tabset/navbar.

Cette approche présente un ensemble d'avantages par rapport à l'utilisation de renderUI:

  • Les panneaux à onglets existants ne sont pas rendus à chaque fois qu'un nouveau panneau est ajouté. (plus rapide)
  • Ainsi, ne réinitialise pas toutes les variables d'entrée à l'intérieur des panneaux existants. (aucune solution de stockage de variable nécessaire)
  • La structure du contenu du panneau peut être choisie individuellement. (Dans la version lapply - renderUI, tous les panneaux doivent être quelque peu uniformes.)

La solution et l'exemple de code peuvent être trouvés dans la réponse ici . Si demandé, je pourrais également poster le code ici.

4
K. Rohde