【发布时间】:2018-02-21 13:19:03
【问题描述】:
我的目标是构建动态生成内容的菜单,并且用户只能看到从顶部到选定的菜单项/菜单项(“下一步”按钮将用于到达下一个尚未显示的菜单项/菜单项;如果应重新生成任何可用的 menuItems/menuSubItems 菜单的选择,以便选择最后一个可用的 menuItems/menuSubItems)。所以我将不得不使用 selected 和 startExpanded 参数,但这不是这个问题的一部分。
我面临的问题是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)
场景:展开 Charts2,然后点击“DDdashboard”。
在控制台中:
[1] "observer"
[1] "DDdashboard"
[1] "Charts2"
[1] "menu_generator"
[1] "observer"
[1] "AAdashboard"
NULL
[1] "menu_generator"
“observer”被调用了两次(结果“menu_generator”也被调用了),所以这会产生意想不到的行为。我的理解是,这是renderMenu 的本质。问题是 - 如何防止 Shiny 在这种情况下两次调用“观察者”?另请注意,在第二次调用中 input$my_menu = "AAdashboard"。
【问题讨论】:
标签: r shiny shinydashboard