如何使 tabItem 仪表板中的 for 循环或 lapply 循环中的函数闪亮
Posted
技术标签:
【中文标题】如何使 tabItem 仪表板中的 for 循环或 lapply 循环中的函数闪亮【英文标题】:How to make a function in a for loop or lapply loop in a tabItem dashboard shiny 【发布时间】:2018-04-05 05:07:27 【问题描述】:我正在制作一个 ShinyDashboard 程序,但在寻找一种方法在dashboardBody 中创建一个循环以捕获MenuItems 时遇到了一些麻烦。这是我正在尝试修复的一个简单示例:
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 作为函数
# lapply(1:5, function(i)
# tabItem(tabName = VecNames[i], uiOutput(paste0("Menu",i)))
# )
有什么帮助吗? 感谢您对高级的回答
【问题讨论】:
【参考方案1】:您的代码中的问题是,您尝试使用tabItem
对象列表作为tabItems
的参数,但根据tabItems
的文档,这是无效的。
tabItems(...)
...
要放入容器的物品。每个项目都应该是一个 tabItem。
do.call
可用于解决此问题。基本上,do.call
的操作如下。
add <- function(x, y)x + y
do.call(add, list(4, 3)) # same as add(4, 3)
## 7
所以你基本上想使用从lapply
返回的列表作为do.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 循环中的函数闪亮的主要内容,如果未能解决你的问题,请参考以下文章
ffmpeg/for 循环:如何使 ffmpeg 或 cmd 循环在发现错误后停止?
如何在没有单击事件的情况下使特定的 TabItem 获得对 TabControl 的关注?
WPF - TabItem 中的“填充”或标题和内容之间的距离
如何使 C++ 中的 for each 循环函数与自定义类一起使用