R Shiny - 将tabPanel动态添加到tabsetPanel(使用renderUI)
Posted
技术标签:
【中文标题】R Shiny - 将tabPanel动态添加到tabsetPanel(使用renderUI)【英文标题】:R Shiny - add tabPanel to tabsetPanel dynamically (with the use of renderUI) 【发布时间】:2013-10-28 12:33:00 【问题描述】:我正在开发一个闪亮的应用程序,我在其中使用tabsetPanel
,它是在用户输入某些特定输入时生成的。因此,我想使用renderUI
函数使tabsetPanel 出现/消失。
我现在的问题是 number of tabPanel
元素(tabsetPanel
的参数)也取决于用户输入,顺便说一下:有时我需要 1 个,其他时候我想要更多tabPanels
。
如何制作?我尝试在 tabsetPanel
参数中包含 conditionPanel
或包含简单的 if()...
条件,但它(并不奇怪......)不起作用。
【问题讨论】:
【参考方案1】:给你。该代码是相当不言自明的。
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)
)
))
【讨论】:
Ramnath,这让我很开心,效果很好!非常感谢!! 很高兴能提供帮助。如果您对代码本身有任何疑问,请在此处发布。 添加:添加选项卡后,将相同的uiOutput
添加到所有选项卡但使每个选项卡中的值唯一的正确方法是什么?或者这有什么不同?如果您添加 output$base_tab_ui
并在每个选项卡中呈现它们,则它们都为每个选项卡保留相同的 input$value
。有没有办法通过不同的输入变量名称使这些唯一?
@Ramnath 您将如何使用自己的内容填充这些动态选项卡中的每一个?也许,比如说,一个 data.frame 的 renderTable / tableOutput 可以使用我用来填充选项卡名称的相同对象进行过滤(即nTabs = length(lags_7)
和myTabs = lapply(sprintf('%s', lags_7), tabPanel)
)(此处可能的答案:***.com/questions/39276104/…)
@d8aninja,假设您将一些地块添加到名为 myPlots 的列表中,您可以这样做:nTabs = length(myPlots); myTabs = lapply(1:nTabs, function(x)tabPanel(paste0("Tab ",x), renderPlot(myPlots[[x]]))); do.call(tabsetPanel, myTabs)
【参考方案2】:
有一种方法可以动态添加tabPanels 没有 renderUI,这可能不像带有renderUI 的版本那么明显。我编写了一个函数 addTabToTabset ,它将任何(列表)tabPanel 附加到选项卡集/导航栏。
与使用 renderUI 相比,此方法具有一组优点:
现有的 tabPanel 不会在每次添加新面板时重新呈现。 (更快) 因此,不会重置现有面板中的所有输入变量。 (无需变量存储解决方法) 可以单独选择面板内容的结构。 (在 lapply - renderUI 版本中,所有面板都必须有点统一。)解决方案和代码示例可以在答案here中找到。如果需要,我也可以在此处发布代码。
【讨论】:
以上是关于R Shiny - 将tabPanel动态添加到tabsetPanel(使用renderUI)的主要内容,如果未能解决你的问题,请参考以下文章
通过导航到 navbarPage 中的特定 tabPanel 触发 R Shiny 反应式