【问题标题】:Dynamic Sidebar Menu in RShiny using renderMenu disappears when another menu item is clicked当单击另一个菜单项时,RShiny 中使用 renderMenu 的动态侧边栏菜单消失
【发布时间】:2020-05-11 02:13:00
【问题描述】:

我正在尝试在 R Shiny Dashboard 中创建一个动态侧边栏面板。我已经成功添加了根据是否满足预定义条件来添加侧边栏菜单项的功能。但是,一旦我单击应用程序中已经存在的任何子菜单项,动态内容就会消失。以下是该问题的一个工作示例:

library(shinycssloaders)
library(shinyalert)
library(shinydashboard)
library(shinyWidgets)


ui <- dashboardPage(dashboardHeader(title = "Title"),
                     dashboardSidebar(
                       sidebarMenu(
                         id = "tabss"
                         ,menuItem("General Information", tabName = "General_Information", icon = icon("android"))
                         ,sidebarMenuOutput("dynamic_content")
                         ,menuItem("Settings", tabName = "settings", icon = icon("cogs")
                                   ,menuSubItem("Setting1", tabName = "Setting1", icon = icon("cogs"))
                                   ,menuSubItem("Setting2", tabName = "Setting2", icon = icon("cogs")))
                         )),
                       dashboardBody(
                         tabItems(
                           tabItem("General_Information",
                                   actionButton("add_menuItem",label = "Add Menu Item"))
                         )
                       )
                       )

server <- function (input, output, session){

  observeEvent(input$add_menuItem,{
    output$dynamic_content <- renderMenu(menuItem("Dynamic Menu","dynamicMenu"))
  })
}

shinyApp(ui, server, options = c(launch.browser = T))

在上面的示例中,使用常规信息页面上的操作按钮会在侧栏面板上在常规信息和设置之间添加一个菜单项。但是,打开设置子菜单会导致动态添加的菜单项从侧边栏中消失。

我正在寻找一种解决方法,以便动态创建的菜单项不会消失。我会欢迎并感谢任何帮助。如果有更多信息对解决方案有帮助,请告诉我。谢谢!

【问题讨论】:

    标签: r shiny shinydashboard shinyjs shinyapps


    【解决方案1】:

    我不确定这是否是您要查找的内容,但您可以添加 reactiveVal 以包含额外的动态菜单项。然后,将您的静态菜单项从ui 移动到server 方法,这样您就可以将动态项包含在一起。希望这可能会有所帮助。

    library(shinycssloaders)
    library(shinyalert)
    library(shinydashboard)
    library(shinyWidgets)
    
    ui <- dashboardPage(dashboardHeader(title = "Title"),
                        dashboardSidebar(
                          sidebarMenu(
                            id = "tabss"
                            ,sidebarMenuOutput("dynamic_content")
                          )),
                        dashboardBody(
                          tabItems(
                            tabItem("General_Information",
                                    actionButton("add_menuItem",label = "Add Menu Item"))
                          )
                        )
    )
    
    server <- function (input, output, session){
    
      menu_val <- reactiveVal(NULL)
    
      observeEvent(input$add_menuItem,{
        menu_val(menuItem("Dynamic Menu", "dynamicMenu"))
      })
    
      output$dynamic_content <- renderMenu({
        menu_list <- list(
          menuItem("General Information", tabName = "General_Information", icon = icon("android")),
          menu_val(),
          menuItem("Settings", tabName = "settings", icon = icon("cogs")
                    ,menuSubItem("Setting1", tabName = "Setting1", icon = icon("cogs"))
                    ,menuSubItem("Setting2", tabName = "Setting2", icon = icon("cogs")))
        )
        sidebarMenu(.list = menu_list) 
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 感谢@Ben 的快速回复。这很完美。但是,我也在寻找一些解释为什么会首先发生这种行为。对此有什么想法吗?
    • 很高兴这解决了...一些额外的想法...我会避免在observeEvent 中调用output$dynamic_content(通常,通常不需要)。此外,对于任何嵌套/复杂的动态menu 生成,我通常会看到menuserver 中的项目一起开发。添加夹在另外两个menuItems 之间的动态菜单内容,这似乎在renderMenu 一起渲染时效果更好。我在其他地方寻找了其他示例,这与我遇到的其他解决方案最接近。我很想知道其他人是否有额外的 cmets。
    • 换句话说......这是一个很好的问题,我希望我对这种行为有更好的想法!
    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2013-01-06
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2020-07-04
    相关资源
    最近更新 更多