2017-10-20 2 views
0

일부 반응 데이터 값을 기반으로 다양한 메뉴 하위 항목을 렌더링해야합니다. 각 하위 항목에 대해 연결된 출력을 연결해야합니다. tabName과 연결을 시도했지만 무엇이 잘못되었는지 확신 할 수 없었습니다.Shiny Dashboard : 여러 메뉴 항목 렌더링 및 동적 내용 출력

다음은 예제입니다. 원하는 출력은 각 메뉴 항목/하위 항목에 대해 하나의 상자가됩니다.

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