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.
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)
})
}
))
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.