我试图在Shiny的tabPanels中显示1到5 navbarPage

我的代码生成了5个图,但我希望用户能够选择要访问的数量-自然可以在每个tabPanel中显示一个图。

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

例如,number_of_tabPages <- 3

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

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

我四处搜寻,发现这种方法的大多数方法
涉及使用uiOutputrenderUI函数(例如此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)
         )
  )
)

07-24 09:51
查看更多