如何在TabItem仪表板的for循环或lapply循环中使函数发光 [英] How to make a function in a for loop or lapply loop in a tabItem dashboard shiny
问题描述
我正在制作一个ShinyDashboard程序,在寻找一种方法来使dashboardBody中的循环捕获MenuItems时遇到了一些麻烦.这是我要解决的一个简单示例:
I'm making a ShinyDashboard program and I have some troubles in finding a way to make a loop in the dashboardBody to catch MenuItems. This is a simple example of what I'm trying to fix:
library(shiny)
library(shinyjs)
library(shinydashboard)
VecNames=c("A","B","C","D","E")
ui <- dashboardPage(
dashboardHeader(title = "My Page"),
dashboardSidebar(sidebarMenuOutput("sideBar_menu_UI")),
dashboardBody(
uiOutput("body_UI"),
uiOutput("test_UI")
)
)
server <- shinyServer(function(input, output, session) {
output$sideBar_menu_UI <- renderMenu({
sidebarMenu(id = "sideBar_Menu",
menuItem("Menu 1", tabName="menu1_tab", icon = icon("calendar"),
lapply(1:length(VecNames), function(i) {
menuSubItem(VecNames[i], tabName = VecNames[i] ,icon = icon("angle-right"))
})
),
menuItem("Menu 2", tabName="menu2_tab", icon = icon("database"))
)
})
output$test_UI <- renderUI ({
A=tabItems(
tabItem(tabName = "menu1_tab", uiOutput("menu1_UI")),
# lapply(1:5, function(i){
# tabItem(tabName = VecNames[i], uiOutput(paste0("Menu",i)))
# }),
tabItem(tabName = VecNames[1], uiOutput(paste0("Menu",1))),
tabItem(tabName = VecNames[2], uiOutput(paste0("Menu",2))),
tabItem(tabName = VecNames[3], uiOutput(paste0("Menu",3))),
tabItem(tabName = VecNames[4], uiOutput(paste0("Menu",4))),
tabItem(tabName = VecNames[5], uiOutput(paste0("Menu",5))),
tabItem(tabName = "menu2_tab", uiOutput("menu2_UI"))
)
})
output$body_UI <- renderUI ({
p("Default content in body outsite any sidebar menus.")
})
output$menu1_UI <- renderUI ({
box("Menu 1 Content")
})
output$menu2_UI <- renderUI ({
box("Menu 2 Content")
})
lapply(1:5, function(i){
output[[paste0("Menu",i)]]<- renderUI({
box(paste0("Menu",i))
})
})
})
runApp(list(ui= ui, server = server))
我想要类似下面的代码,但是lapply似乎不接受tabItem作为函数
I want something like the following code but it seems that lapply doesn't accept tabItem as a function
# lapply(1:5, function(i){
# tabItem(tabName = VecNames[i], uiOutput(paste0("Menu",i)))
# })
有帮助吗? 感谢您对高级的回答
Any help? Thank you for your answers on advanced
推荐答案
代码中的问题是,您尝试使用tabItem
对象的列表作为tabItems
的参数,但这根据tabItems
的文档.
The problem in your code is, that you try to use a list of tabItem
objects as an argument for tabItems
, but this is invalid according to the documentation of tabItems
.
tabItems(...)
...
要放入容器中的项目.每个项目都应该是一个tabItem.
...
Items to put in the container. Each item should be a tabItem.
do.call
可用于解决此问题.基本上do.call
操作如下.
do.call
can be used to resolve this issue. Basically, do.call
operates as follows.
add <- function(x, y){x + y}
do.call(add, list(4, 3)) # same as add(4, 3)
## 7
因此,您基本上想将lapply
返回的列表用作do.call
的第二个参数,而第一个参数是要调用的函数(tabItems
).
So you basically want to use the list returned from lapply
as the second argument to do.call
while the first argument is the function to call (tabItems
).
output$test_UI <- renderUI ({
items <- c(
list(tabItem(tabName = "menu1_tab", uiOutput("menu1_UI"))),
lapply(1:5, function(i){
tabItem(tabName = VecNames[i], uiOutput(paste0("Menu",i)))
})
)
do.call(tabItems, items)
})
这篇关于如何在TabItem仪表板的for循环或lapply循环中使函数发光的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!