R brillant - ajouter tabPanel à tabsetPanel dynamiquement (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 panneau d'onglets.

mon combat est maintenant que nombre de tabPanel éléments (arguments de tabsetPanel ) dépend également de l'utilisateur entrée , de la manière: parfois, j'ai besoin d'un, d'autres fois je veux plus tabPanels .

Comment le faire? J'ai essayé d'inclure conditionPanel ou d'inclure la condition simple if()... dans l'argument tabsetPanel , mais il (plutôt pas surprenant...) ne fonctionne pas.

36
demandé sur Cœur 2013-10-19 23:53:59

2 réponses

voilà. 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)
    })
  }
))
63
répondu Ramnath 2013-10-19 20:06:12

il y a une façon d'ajouter dynamiquement tabPanels sans renderUI, qui pourrait ne pas être aussi évidente que la version avec renderUI. J'ai écrit une fonction addTabToTabset qui ajoutera n'importe quel (s) tabPanel(s) à un tabset/navbar.

cette approche a un ensemble de avantages sur l'utilisation de renderUI:

  • tabPanels existants ne sont pas rendus chaque fois qu'un nouveau le panneau est ajouté. (plus rapide)
  • donc, ne pas réinitialiser toutes les variables d'entrée à l'intérieur des panneaux existants. milliard cinq cent dix neuf million cents vingt mille neuf cent vingt"
  • Structure du contenu du panneau peut être choisi individuellement. (Dans la version lapply-renderUI, tous les panneaux doivent être un peu uniformes.)

la solution et l'échantillon de code se trouvent dans la réponse ici . Si demandé, je pourrais également afficher le code ici.

2
répondu K. Rohde 2017-05-23 12:02:38