R Brilhante – adicione tabPanel a tabsetPanel dinamicamente (com o uso de renderUI)

Eu estou desenvolvendo um aplicativo shiny em que eu uso tabsetPanel , que é gerado quando o usuário entra em alguma input particular. Assim, eu quero usar a function renderUI para fazer um tabsetPanel aparecer / desaparecer.

Minha luta agora é que o número de elementos tabPanel (argumentos de tabsetPanel ) também depende da input do usuário , da maneira: às vezes eu preciso de um, outras vezes eu quero mais tabPanels .

Como fazer isso? Eu tentei include conditionPanel ou incluindo simples if()... condição no argumento tabsetPanel , mas (em vez não surpreendentemente …) não funcionou.

Aqui está. O código é bastante auto explicativo.

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

Existe uma maneira de adicionar dinamicamente tabPanels sem renderUI, que pode não ser tão óbvio quanto a versão com renderUI. Eu escrevi uma function addTabToTabset que irá append qualquer (lista de) tabPanel (s) a uma tabset / navbar.

Essa abordagem tem um conjunto de vantagens sobre o uso do renderUI:

  • Os tabPanels existentes não são renderizados novamente a cada vez que um novo painel é adicionado. (Mais rápido)
  • Assim, não redefinir todas as variables ​​de input dentro dos painéis existentes. (não é necessário armazenar variables ​​variables)
  • A estrutura do conteúdo do painel pode ser escolhida individualmente. (Na versão lapply – renderUI, todos os painéis precisam ser uniformes).

A solução e a amostra de código podem ser encontradas na resposta aqui . Se solicitado, também posso postar o código aqui.