2017-10-20 11 views
0

いくつかの反応的なデータ値に基づいてさまざまなメニューサブアイテムをレンダリングする必要があります。各サブ項目について、リンクされた出力を関連付ける必要もあります。 tabNameとリンクしようとしましたが、何が間違っているかはわかりません。シャイニーダッシュボード:複数のメニューアイテムをレンダリングし、それぞれに動的コンテンツを出力する

以下は例です。目的の出力は、各メニュー項目/サブ項目ごとに1つのボックスになります。

## 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

私自身の質問に答えるが、もっとエレガントなものを持っていれば自由にジャンプできます。

光沢のあるダッシュボードの私の最初の理解は間違っていて、アプリの構造が無効になると思います。

idsidebarMenuに追加すると、ページのフォーカスを後で追跡して解析できるようになります。次に、各レンダリング関数は入力をリッスンし、関連するコンテンツをレンダリングします。

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") 
    }) 
    } 
) 
関連する問題