在闪亮仪表板中选择菜单项时显示第二个菜单

时间:2019-04-03 10:31:12

标签: r shiny menu shinydashboard

我有一个发光的仪表板,并且在侧栏中有两个菜单。第一个有两个项目,第二个有五个项目。

仪表板加载时,默认情况下,第一个菜单中的第一个项目“ Home”被选择。选择第二项时,将显示第二个菜单。

我已经成功显示了第二个菜单,但第一个菜单又回到了“主页”菜单项。您可以单击第二个菜单中的任何项目都很好,但是选择第二个项目时,第一个菜单始终会变回原始项目。我希望它在被选中时停留在第二个项目上,基本上将两个菜单当作一个菜单使用。

但是我不希望第二个菜单成为子菜单,因为它不是。

下面是一些显示问题的伪代码。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(skin = "blue", title = "",
                    dashboardHeader(),
                    dashboardSidebar(
                      sidebarMenu(id="fMenu", sidebarMenuOutput("firstMenu")),
                      sidebarMenu(id = "eMenu", sidebarMenuOutput("extendedMenu"))
                      ),
                    dashboardBody()
)

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



  output$firstMenu <- renderMenu({
    menu_list <- list(
      menuItem("Home", tabName = "home", icon = icon("home")),
      menuItem("2nd Item", tabName = "second", icon = icon("sort"))
    )

    sidebarMenu(.list = menu_list)
  })

  isolate({updateTabItems(session, "featureMenu", "home")})

  observeEvent(input$fMenu, {
    if(input$fMenu == "second"){
      output$extendedMenu <- renderMenu({
        menu_list <- list(
          menuItem("3rd Item", tabName = "third", icon = icon("sort")),
          menuItem("4th Item", tabName = "fourth", icon = icon("sort")),
          menuItem("5th Item", tabName = "fifth", icon = icon("sort"))
        )

        sidebarMenu(.list = menu_list)
      })
    }
  })

})

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

菜单的重新渲染使它重新选择第一个选项卡。您可以在selected中使用参数menuItem来保持选择第二个选项卡。但是,在这种情况下,您应该只有一个sidebarMenu和一个sidebarMenuOutput

工作示例

library(shiny)
library(shinydashboard)

ui <- dashboardPage(skin = "blue", title = "",
                    dashboardHeader(),
                    dashboardSidebar(
                      sidebarMenu(id="fMenu", 
                                  sidebarMenuOutput("firstMenu"))
                    ),
                    dashboardBody()
)

server <- (function(input, output, session) {
  output$firstMenu <- renderMenu({
    menu_list <- list(
      menuItem("Home", tabName = "home", icon = icon("home")),
      menuItem("2nd Item", tabName = "second", icon = icon("sort"))
    )
    sidebarMenu(.list = menu_list)
  })

  observeEvent(input$fMenu, {
    if(input$fMenu == "second"){
      output$firstMenu <- renderMenu({
        menu_list <- list(
          menuItem("Home", tabName = "home", icon = icon("home")),
          menuItem("2nd Item", tabName = "second", icon = icon("sort"), selected=T),
          menuItem("3rd Item", tabName = "third", icon = icon("sort")),
          menuItem("4th Item", tabName = "fourth", icon = icon("sort")),
          menuItem("5th Item", tabName = "fifth", icon = icon("sort"))
        )

        sidebarMenu(.list = menu_list)
      })

    }
  })
})

shinyApp(ui, server)