R Shiny - 动态地将tabPanel添加到tabsetPanel(使用renderUI)

时间:2013-10-19 19:54:00

标签: r tabpanel shiny

我正在开发一个闪亮的应用程序,我在其中使用tabsetPanel,这是在用户输入某些特定输入时生成的。因此,我想使用renderUI函数使tabsetPanel显示/消失。

我现在的努力是 tabPanel个元素(tabsetPanel的参数)也取决于用户输入,顺便说一下:有时候我需要1个,有时我需要更多tabPanels

如何制作?我尝试在conditionPanel参数中包含if()...或包含简单tabsetPanel条件,但它(并不奇怪......)不起作用。

2 个答案:

答案 0 :(得分:67)

你走了。代码是相当自我解释的。

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

答案 1 :(得分:3)

有一种方法可以动态添加tabPanel 而不用 renderUI,这可能不像带有renderUI的版本那么明显。我编写了一个函数 addTabToTabset ,它将任何(list of)tabPanel附加到tabset / navbar。

这种方法比使用renderUI具有一组优点

  • 每次添加新面板时,不会重新呈现现有的tabPanel。 (更快)
  • 因此,不重置现有Panel中的所有输入变量。 (无需变量存储变通办法)
  • 可以单独选择面板内容的结构。 (在lapply - renderUI版本中,所有面板都必须有些统一。)

解决方案和代码示例可以在答案here中找到。如果需要,我也可以在这里发布代码。