【问题标题】:How to make a function in a for loop or lapply loop in a tabItem dashboard shiny如何使 tabItem 仪表板中的 for 循环或 lapply 循环中的函数闪亮
【发布时间】: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)))        
  #      })

有什么帮助吗? 感谢您对高级的回答

【问题讨论】:

    标签: loops shiny lapply dashboard tabitem


    【解决方案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)
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2021-07-31
      • 2019-05-11
      相关资源
      最近更新 更多