R Shiny – 将tabPaneldynamic添加到tabsetPanel(使用renderUI)

我正在开发一个shiny的应用程序,我使用tabsetPanel ,这是用户input一些特定的input时生成的。 因此,我想使用renderUI函数使tabsetPanel出现/消失。

我现在的挣扎是tabPanel元素( tabsetPanel参数)的数量也取决于用户input ,方式:有时我需要1个,其他时候我想要更多的tabPanels

如何做到这一点? 我尝试了包括conditionPanel或在tabsetPanel参数中包含简单的if()...条件,但它(而不是奇怪…)没有工作。

干得好。 代码是相当自我解释。

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

有一种方法可以在不使用 renderUI的情况下dynamic添加tabPanel,这可能不如使用renderUI的版本那么明显。 我写了一个函数addTabToTabset ,它将任何(列表)tabPanel(s)追加到一个标签集/导航栏。

与使用renderUI 相比 ,这种方法具有一系列优势

  • 每次添加新面板时,现有的tabPanel不会重新渲染。 (更快)
  • 因此,不要重置现有面板中的所有inputvariables。 (不需要variables存储变通办法)
  • 面板内容的结构可以单独select。 (在lapply – renderUI版本中,所有的面板都必须有点统一。)

解决scheme和代码示例可以在这里find答案。 如果有要求,我也可以在这里发布代码。