Servet
Servet

Reputation: 287

R shinydashboard dynamic menu selection

I have created dynamic sibebar menus in R shinydashboard. Even though I use selected = TRUE, no menuItem associated with a menu gets selected at startup in this dynamic mode.

How can I make sure I have control on which menuItem's contents is shown at startup in this dynamic mode?

I have been searching all over through similar posts. Could not find anything that work so far. updateTabItems() did not seem to work.

Any ideas? thanks from advance.

library(shiny)
library(shinydashboard)
ui <- dashboardPage(
  dashboardHeader(title = "Dynamic sidebar"),
  dashboardSidebar(
    sidebarMenuOutput("menu")
  ),
  dashboardBody(
        tabItems(
          tabItem(tabName = "m1", p("Menu content 1") ),
          tabItem(tabName = "m2", p("Menu content 2") )
    )
   )
)
server <- function(input, output) {
  output$menu <- renderMenu({
    sidebarMenu(
      menuItem("Menu item1", tabName="m1", icon = icon("calendar")),
      menuItem("Menu item2", tabName="m2", icon = icon("database"),selected = TRUE)
    )
  })
}
shinyApp(ui, server)

Edit : Indentation problem that occurs with Romain's anwser hsh

Upvotes: 8

Views: 9086

Answers (2)

sigbert
sigbert

Reputation: 77

Why not using an observer which is called only once at app init

observe({ # called only once at app init
  updateTabItems(session, "tabs", "m2")
})

Upvotes: 0

Romain
Romain

Reputation: 450

You have effectively to use updateTabItems(). To do so you have to set up an id for the sidebarMenu and update the corresponding menuItem or menuSubItem.

For your specific case you should do something like this:

library(shiny)
library(shinydashboard)
ui <- dashboardPage(
  dashboardHeader(title = "Dynamic sidebar"),
  dashboardSidebar(
    sidebarMenu(id="tabs",
    sidebarMenuOutput("menu")
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName = "m1", p("Menu content 1") ),
      tabItem(tabName = "m2", p("Menu content 2") )
    )
  )
)
server <- function(input, output,session) {

  output$menu <- renderMenu({
    sidebarMenu(
           menuItem("Menu item1", tabName="m1", icon = icon("calendar")),
           menuItem("Menu item2", tabName="m2", icon = icon("database"))
           )
  })
  isolate({updateTabItems(session, "tabs", "m2")})
}
shinyApp(ui, server)

Edited version to remove the indentation problem

Upvotes: 8

Related Questions