2017-10-20 40 views
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) {} 
) 

回答

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") 
    }) 
    } 
)