我试图在Shiny的tabPanels
中显示1到5 navbarPage
。
我的代码生成了5个图,但我希望用户能够选择要访问的数量-自然可以在每个tabPanel
中显示一个图。
我有一个外部配置文件(config.txt
),可以通过source('config.txt')
访问number_of_pages
变量。
例如,number_of_tabPages <- 3
我将如何在UI.R
中进行设置?
tabPanel的数量根本不能在UI文件中进行硬编码,因为它取决于用户指定的值,而不使用控件。
我四处搜寻,发现这种方法的大多数方法
涉及使用uiOutput
和renderUI
函数(例如此similar问题),但是我不希望UI中的任何特殊控件进行选择。
当我们根据可能更改的值构建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)
)
)
)