Search code examples
reventsshinysubmenuaction-button

R shiny dashboard body dependant from shiny subitem selection


Is it a way to create an shiny observeEvent dependant from shiny subitem selection?

In the following reproductible example, I would like to automaticaly execute button 1 when submenu 1 is clicked and automaticaly execute button 3 when submenu 2 is clicked.

library(shinydashboard)
library(shiny)


ui <- dashboardPage(
 dashboardHeader(title = "Dynamic sidebar"),
 dashboardSidebar(
   sidebarMenuOutput("menu")
 ),
dashboardBody(heigth = 800,  tabItems(
                                     tabItem(tabName = "submenu_1",
                                             fluidRow(
                                               actionButton(inputId = "button_1",label = "Button 1",  icon = icon("fa"),width = '417px'),
                                               actionButton(inputId = "button_2",label = "Button 2",  icon = icon("fa"),width = '417px')
                                             )
                                     ),
                                       tabItem(tabName = "submenu_2",
                                               fluidRow(
                                                 actionButton(inputId = "button_3",label = "Button 3",  icon = icon("fa"),width = '417px'),
                                                 actionButton(inputId = "button_4",label = "Button 4",  icon = icon("fa"),width = '417px')
                                               )
                                       )

                        ),
            textOutput("text")
            )
)


server <- function(input, output) {
output$menu <- renderMenu({
sidebarMenu(
  menuItem("Menu item 1", 
           menuSubItem('Submenu 1',tabName = 'submenu_1',icon = icon('line-chart')),
           menuSubItem('Submenu 2',tabName = 'submenu_2',icon = icon('line-chart'))
           )
)
})


 observeEvent(input$button_1,{output$text <- renderText("Buutton 1 must be selected by default on Submenu 1")})
 observeEvent(input$button_2,{output$text <- renderText("You have selected button 2")})
 observeEvent(input$button_3,{output$text <- renderText("Buutton 3 must be selected by default on Submenu 2 ")})
 observeEvent(input$button_4,{output$text <- renderText("You have selected button 4")})
}

shinyApp(ui, server)

Thanks in advance!


Solution

  • Is that what you need??

    You can add an id argument in sidebarMenu, and then add an observeEvent object triggered by input$sidebarmenu

    library(shinydashboard)
    library(shiny)
    
    
    ui <- dashboardPage(
      dashboardHeader(title = "Dynamic sidebar"),
      dashboardSidebar(
        sidebarMenuOutput("menu")
      ),
      dashboardBody(heigth = 800,  tabItems(
        tabItem(tabName = "submenu_1",
                fluidRow(
                  actionButton(inputId = "button_1",label = "Button 1",  icon = icon("fa"),width = '417px'),
                  actionButton(inputId = "button_2",label = "Button 2",  icon = icon("fa"),width = '417px')
                )
        ),
        tabItem(tabName = "submenu_2",
                fluidRow(
                  actionButton(inputId = "button_3",label = "Button 3",  icon = icon("fa"),width = '417px'),
                  actionButton(inputId = "button_4",label = "Button 4",  icon = icon("fa"),width = '417px')
                )
        )
    
      ),
      textOutput("text")
      )
    )
    
    
    server <- function(input, output) {
      output$menu <- renderMenu({
        sidebarMenu(id = "sidebarmenu",
          menuItem("Menu item 1", 
                   menuSubItem('Submenu 1',tabName = 'submenu_1',icon = icon('line-chart')),
                   menuSubItem('Submenu 2',tabName = 'submenu_2',icon = icon('line-chart'))
          )
        )
      })
    
      observeEvent(input$sidebarmenu,{
        output$text <- renderText({
          if(input$sidebarmenu=="submenu_1"){
            "Buutton 1 must be selected by default on Submenu 1"
          }else if(input$sidebarmenu=="submenu_2"){
            "Buutton 3 must be selected by default on Submenu 2 "
          }
        })
      })
    
      observeEvent(input$button_1,{
        output$text <- renderText("Buutton 1 must be selected by default on Submenu 1")
      })
      observeEvent(input$button_2,{
        output$text <- renderText("You have selected button 2")
      })
      observeEvent(input$button_3,{
        output$text <- renderText("Buutton 3 must be selected by default on Submenu 2 ")
      })
      observeEvent(input$button_4,{
        output$text <- renderText("You have selected button 4")
      })
    
    }
    
    shinyApp(ui, server)