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