在 Shiny Dashboard 中选择菜单项时显示第二个菜单
Display Second Menu when a Menu Item is selected in Shiny Dashboard
我有一个闪亮的仪表板,在边栏中我有两个菜单。第一个有两个项目,第二个有五个。
当仪表板加载第一个菜单项时 "Home" 默认选择第一个菜单。选择第二项时,显示第二个菜单。
我已成功显示第二个菜单,但第一个菜单返回到 "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)
菜单的重新呈现导致它重新select第一个选项卡。您可以在 menuItem
中使用参数 selected
来保留第二个选项卡 selected。但是,在这种情况下,您应该只有一个 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)
我有一个闪亮的仪表板,在边栏中我有两个菜单。第一个有两个项目,第二个有五个。
当仪表板加载第一个菜单项时 "Home" 默认选择第一个菜单。选择第二项时,显示第二个菜单。
我已成功显示第二个菜单,但第一个菜单返回到 "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)
菜单的重新呈现导致它重新select第一个选项卡。您可以在 menuItem
中使用参数 selected
来保留第二个选项卡 selected。但是,在这种情况下,您应该只有一个 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)