49

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

我现在的挣扎是元素(的参数)的数量 也取决于用户输入,顺便说一句:有时我需要 1 个,其他时候我想要更多。tabPaneltabsetPaneltabPanels

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

4

2 回答 2

83

干得好。该代码是相当不言自明的。

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)
    })
  }
))
于 2013-10-19T20:06:12.500 回答
4

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

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

  • 每次添加新面板时,不会重新渲染现有的 tabPanel。(快点)
  • 因此,不会重置现有面板中的所有输入变量。(不需要变量存储解决方法)
  • 面板内容的结构可以单独选择。(在 lapply - renderUI 版本中,所有面板都必须有点统一。)

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

于 2016-04-17T08:28:19.233 回答