Shiny:Shiny Dashboard (sidebarMenu) 中的 renderMenu 和 observeEvent 冲突

Posted

技术标签:

【中文标题】Shiny:Shiny Dashboard (sidebarMenu) 中的 renderMenu 和 observeEvent 冲突【英文标题】:Shiny: renderMenu and observeEvent conflict in Shiny Dashboard (sidebarMenu) 【发布时间】:2018-02-21 13:19:03 【问题描述】:

我的目标是构建动态生成内容的菜单,并且用户只能看到从顶部到选定的菜单项/菜单项(“下一步”按钮将用于到达下一个尚未显示的菜单项/菜单项;如果应重新生成任何可用的 menuItems/menuSubItems 菜单的选择,以便选择最后一个可用的 menuItems/menuSubItems)。所以我将不得不使用 selectedstartExpanded 参数,但这不是这个问题的一部分。

我面临的问题是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)

场景:展开 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"。

【问题讨论】:

【参考方案1】:
observeEvent(input$sidebarItemExpanded == 'DDdashboard',

print("DDdashboard_selected")

  )

【讨论】:

以上是关于Shiny:Shiny Dashboard (sidebarMenu) 中的 renderMenu 和 observeEvent 冲突的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Shiny Dashboard 中固定控制栏的颜色

如何在 Shiny Dashboard 的框中将表格居中

将函数连接到 R Shiny Dashboard 中的 actionButton

有没有啥可以从 Shiny Dashboard 触发 GitHub 操作工作流?

shiny 发布部署到公开网站 ,供别人访问

shiny 发布部署到公开网站 ,供别人访问