2017-09-13 15 views
0

私の目的は、コンテンツが動的に生成されるメニューを構築することです。メニューアイテムの上から順番にメニューアイテムが表示されます(「次へ」ボタンはmenuItems/menuSubItems;使用可能なmenuItems/menuSubItemsメニューが選択された場合は、最後に使用可能なmenuItems/menuSubItemsが選択されるように再生成する必要があります。だから私はstartExpanded引数を選択して遊ぶ必要がありますが、これはこの質問の一部ではありません。Shiny:Shiny Dashboard(sidebarMenu)でrenderMenuとobserveEventの競合が発生する

私が直面した問題は、renderMenuobserveEvent(選択されたmenuItem/menuSubItemをチェックする)の相互接続です。

library(shiny) 
library(shinydashboard) 

menu_generator <- function(selected = NULL, expanded = NULL){ 

    print("menu_generator") 

    output <- sidebarMenu(

    menuItem("Charts1", icon = icon("bar-chart-o"), 
      menuSubItem("AAdashboard", tabName = "AAdashboard"), 
      menuSubItem("BBdashboard", tabName = "BBdashboard") 
    ), 
    menuItem("Charts2", icon = icon("bar-chart-o"), 
      menuSubItem("DDdashboard", tabName = "DDdashboard"), 
      menuSubItem("EWidgets", tabName = "EWidgets") 
    ) 

) 

    return(output) 
} 

ui <- dashboardPage(
    dashboardHeader(title = "Test"), 
    dashboardSidebar(sidebarMenu(
    sidebarMenuOutput("menu_output") 
)), 
    dashboardBody(
    tabItems(
     tabItem(tabName = "AAdashboard", 
       h2("ADashboard tab content") 
    ), 

     tabItem(tabName = "BBdashboard", 
       h2("BWidgets tab content") 
    ), 

     tabItem(tabName = "DDdashboard", 
       h2("DWidgets tab content") 
    ), 

     tabItem(tabName = "EWidgets", 
       h2("EWidgets tab content") 
    ) 
    )) 
) 


server <- function(input, output) { 

    output$menu_output <- renderMenu({ 
    print("output$menu_output") 
    sidebarMenu(menu_generator(), 
       id = "my_menu") 

    }) 

    observeEvent(input$my_menu, { 

    print("observer") 

    print(input$my_menu) 
    print(input$sidebarItemExpanded) 

    output$menu_output <- renderMenu({ 
     sidebarMenu(menu_generator(), 
        id = "my_menu") 
    }) 
    }) 


} 

shinyApp(ui, server) 

シナリオ:クリックして "DDdashboardを" Charts2を展開するここでは、コードです。コンソールで

[1] "observer" 
[1] "DDdashboard" 
[1] "Charts2" 
[1] "menu_generator" 
[1] "observer" 
[1] "AAdashboard" 
NULL 
[1] "menu_generator" 

"オブザーバー" は(結果として "menu_generator" も)を2回呼ばれ、これは予期しない動作を作成しています。私の理解は、その理由はrenderMenuの性質です。問題は、シャイニーがこの場合「オブザーバー」を2回呼ぶのを防ぐ方法です。また、第2の呼び出しではinput$my_menu = "AAdashboard"に気付くことになります。

答えて

-1
observeEvent(input$sidebarItemExpanded == 'DDdashboard',{ 

print("DDdashboard_selected") 

    }) 
関連する問題