在没有 renderUI 或 uiOutput 的 navbarPage 中显示不同数量的 tabPanel

display different number of tabPanels in a navbarPage in Shiny, without renderUI or uiOutput

我正在尝试在闪亮的 navbarPage 中显示 1 到 5 tabPanels

我的代码生成了 5 个图,但我希望用户能够 select 他们想要访问多少个图——每个图显示一个图 tabPanel, 顺其自然。

我有一个外部配置文件 (config.txt),通过 source('config.txt'),我可以访问 number_of_pages 变量。

例如,number_of_tabPages <- 3

我如何在 UI.R 中进行设置?

tabPanel 的数量根本不能硬编码在 UI 文件中,因为它取决于用户指定的值,而不是使用控件。

我四处搜索了一下,发现大多数解决这类问题的方法 涉及使用 uiOutputrenderUI 函数,例如这个 similar 问题,但我不希望 UI 中的任何特殊控件执行任何 selecting .

这就是事情变得棘手的地方,当我们根据可能改变的值构建 UI 时。我的大脑正试图围绕做这种事情的最佳方法来思考——我觉得它不完全符合 Shiny 希望使用 UI <--> 服务器环境与自己通信的方式.

非常感谢任何建议。

我的 UI.R 在不是动态时很容易创建:

fluidRow(
column(12,
       "", 
       navbarPage("",tabPanel("First Tab", 
                              plotOutput("plot1")),

                  tabPanel("Second Tab",
                           plotOutput("plot2")),

                  tabPanel("Third Tab",
                           plotOutput("plot3")),

                  tabPanel("Fourth Tab",
                           plotOutput("plot4")),

                  tabPanel("Fifth Tab",
                           plotOutput("plot5"))
                  )
       )
)
)

谢谢!

如果您不需要用户以交互方式更改 tabPanel 的数量,而只是在应用程序启动时加载不同数量的它们,您可以使用 do.call 中的函数 navBarPage:

library(dplyr)
library(shiny)
library(ggvis)

#number of tabs needed
number_of_tabPages <- 10

#make a list of all the arguments you want to pass to the navbarPage function
tabs<-list()
#first element will be the title, empty in your example
tabs[[1]]=""

#add all the tabPanels to the list
for (i in 2:(number_of_tabPages+1)){
  tabs[[i]]=tabPanel(paste0("Tab",i-1),plotOutput(paste0("plot",i-1)))

}

 #do.call will call the navbarPage function with the arguments in the tabs list
shinyUI(fluidRow(
  column(12,
         "", 
         do.call(navbarPage,tabs)
         )
  )
)