如何在TabItem仪表板的for循环或lapply循环中使函数发光 [英] How to make a function in a for loop or lapply loop in a tabItem dashboard shiny

查看:112
本文介绍了如何在TabItem仪表板的for循环或lapply循环中使函数发光的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆