2017-10-20 127 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") 
    }) 
    } 
)