在没有 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 文件中,因为它取决于用户指定的值,而不是使用控件。
我四处搜索了一下,发现大多数解决这类问题的方法
涉及使用 uiOutput
和 renderUI
函数,例如这个 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)
)
)
)
我正在尝试在闪亮的 navbarPage
中显示 1 到 5 tabPanels
。
我的代码生成了 5 个图,但我希望用户能够 select 他们想要访问多少个图——每个图显示一个图 tabPanel
, 顺其自然。
我有一个外部配置文件 (config.txt
),通过 source('config.txt')
,我可以访问 number_of_pages
变量。
例如,number_of_tabPages <- 3
我如何在 UI.R
中进行设置?
tabPanel 的数量根本不能硬编码在 UI 文件中,因为它取决于用户指定的值,而不是使用控件。
我四处搜索了一下,发现大多数解决这类问题的方法
涉及使用 uiOutput
和 renderUI
函数,例如这个 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)
)
)
)