r语言 - 闪亮仪表板:呈现多个菜单项并为每个菜单项输出动态内容



我需要根据一些反应式数据值渲染各种菜单子项。对于每个子项,我还需要关联链接输出。我试图与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) {}
)

回答我自己的问题,但如果你有更优雅的东西,请随时加入。

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

这里的诀窍是将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")
    })
  }
)

最新更新