Есть ли способ, которым мы можем сделать sidebarMenu -> menuItems динамическим? - PullRequest
0 голосов
/ 29 июня 2018

Я делаю программу ShinyDashboard, и у меня есть некоторые проблемы с поиском способа сделать цикл в MenuItems. В частности, я ищу что-то, что может заменить следующие строки:

menuItem(
  "Section1",
  tabName = "Section1",
  startExpanded = T,
  menuSubItem("Sub Menu 1", tabName = "tab1"),
  menuSubItem("Sub Menu 2", tabName = "tab2")
  ),

menuItem(
  "Section2",
  tabName = "Section2",
  startExpanded = T,
  menuSubItem("Sub Menu 1", tabName = "tab1"),
  menuSubItem("Sub Menu 2", tabName = "tab2")
  )

Вот что я попробовал:

lapply(1:2, function(i){
       do.call(menuItem, c(text = paste0("Section",i), tabName =paste0("Section",i), startExpanded = T,
       lapply(1:2, function(j) {
           menuSubItem(text = paste0("sub menu ", j), tabName=paste0("tab",j))
       }
       )))
  })

Выдает следующую ошибку:

Ошибка в: $ оператор недопустим для атомных векторов

Я прошел пост, который делает нечто подобное с dashboardBody -> tabItems

Как сделать функцию в цикле for или цикле lapply на панели инструментов tabItem блестящей

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Нашли решение

output$menu <- renderMenu(
    {
      sidebarMenu(id = "sbm",
                  lapply(1:10, function(i){
                    do.call(menuItem, c(text = paste0("Section",i), tabName = paste0("Section",i), startExpanded = T,
                                        lapply(1:2, function(j) {
                                          menuSubItem(text = paste0("sub menu ", j), tabName=paste0("tab",j))
                                        }
                                        )))
                  }
                    ))
      })
0 голосов
/ 29 июня 2018

Я не совсем уверен, что это то, что вы ищете, но код ниже динамически создает эти два пункта меню вместе с их подэлементами.

library(shiny)
library(shinydashboard)


ui <- dashboardPage(
  dashboardHeader(title = "My Page"),
  dashboardSidebar(sidebarMenuOutput("sidebar_menu")),
  dashboardBody(
    NULL
  ) 
)

server <- shinyServer(function(input, output, session) { 
  output$sidebar_menu <- renderMenu({
    sidebarMenu(id = "tab",

                menuItem("Section1", tabName="Section2", startExpanded = T,
                         lapply(1:2, function(i) {
                           menuSubItem(paste0("Sub Menu ",i), tabName = paste0("tab",i))
                         })
                ),
                menuItem("Section2", tabName="Section2", startExpanded = T,
                         lapply(1:2, function(i) {
                           menuSubItem(paste0("Sub Menu ",i), tabName = paste0("tab",i))
                         })
                )
    )


  })

})
runApp(list(ui= ui, server = server))
...