首页 文章

闪亮仪表板:渲染多个菜单项并为每个菜单项输出动态内容

提问于
浏览
0

我需要根据一些反应数据值渲染各种菜单子项 . 对于每个子项,我还需要关联链接的输出 . 我试图链接 tabName ,但不知道出了什么问题 .

以下是一个例子 . 每个菜单项/子项的所需输出将是一个框 .

## This code snippet doesn't do what I need ----
shinyApp(
  ui = dashboardPage(
    dashboardHeader(),
    dashboardSidebar(
      sidebarMenu(
        menuItemOutput("dynamic_menu"),
        menuItem("Menu2", tabName = "menu2")
      )
    ),
    dashboardBody(
      tabItems(
        uiOutput("menu1_content"),
        tabItem(tabName = "menu2", box("I am menu2"))
      )
    ),
    title = "Example"
  ),

  server = function(input, output) {
    output$dynamic_menu <- renderMenu({
      submenu_list <- lapply(letters[1:5], function(x) {
        menuSubItem(x, tabName = paste0("menu1-", x))
      })
      menuItem(
        text = "Menu1",
        startExpanded = TRUE,
        do.call(tagList, submenu_list)
      )
    })

    output$menu1_content <- renderUI({
      content_list <- lapply(letters[1:5], function(x) {
        tabItem(
          tabName = paste0("menu1-", x),
          box(x)
        )
      })
      do.call(tagList, content_list)
    })
  }
)


## This code snippet does what I need ----
shinyApp(
  ui = dashboardPage(
    dashboardHeader(),
    dashboardSidebar(
      sidebarMenu(
        menuItem(
          "Menu1", startExpanded = TRUE,
          menuSubItem("a", tabName = "menu1-a"),
          menuSubItem("b", tabName = "menu1-b"),
          menuSubItem("c", tabName = "menu1-c"),
          menuSubItem("d", tabName = "menu1-d"),
          menuSubItem("e", tabName = "menu1-e")
        ),
        menuItem("Menu2", tabName = "menu2")
      )
    ),
    dashboardBody(
      tabItems(
        tabItem(tabName = "menu1-a", box("a")),
        tabItem(tabName = "menu1-b", box("b")),
        tabItem(tabName = "menu1-c", box("c")),
        tabItem(tabName = "menu1-d", box("d")),
        tabItem(tabName = "menu1-e", box("e")),
        tabItem(tabName = "menu2", box("I am menu2"))
      ),
      title = "Example"
    )
  ),
  server = function(input, output) {}
)

1 回答

  • 0

    回答我自己的问题,但如果你有更优雅的东西,可以随意进入 .

    我认为我对闪亮仪表板的初步理解是错误的,导致应用程序结构无效 .

    这里的技巧是将 id 添加到 sidebarMenu ,以便稍后可以跟踪和解析页面焦点 . 然后每个渲染函数将侦听输入并呈现相关内容 .

    shinyApp(
      ui = dashboardPage(
        dashboardHeader(),
        dashboardSidebar(
          sidebarMenu(
            id = "sidebar_menu",
            menuItemOutput("dynamic_menu"),
            menuItem("Menu2", tabName = "menu2")
          )
        ),
        dashboardBody(
          uiOutput("menu1_content"),
          uiOutput("menu2_content")
        ),
        title = "Example"
      ),
      server = function(input, output, session) {
        output$dynamic_menu <- renderMenu({
          menu_list <- lapply(letters[1:5], function(x) {
            menuSubItem(x, tabName = paste0("menu1-", x))
          })
          menuItem(
            text = "Menu1",
            startExpanded = TRUE,
            do.call(tagList, menu_list)
          )
        })
    
        output$menu1_content <- renderUI({
          sidebar_menu <- tstrsplit(input$sidebar_menu, "-")
          if (sidebar_menu[[1]] == "menu1") box(sidebar_menu[[2]])
        })
    
        output$menu2_content <- renderUI({
          sidebar_menu <- tstrsplit(input$sidebar_menu, "-")
          if (sidebar_menu[[1]] == "menu2") box("I am menu2")
        })
      }
    )
    

相关问题