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