Home > database >  Display and hide actionButton based on 2 other actionButtons
Display and hide actionButton based on 2 other actionButtons

Time:06-03

Below I press the first actionButton() "Show" to display another actionButton() but I would like also a second actionButton() named "Hide" that will hide the actionButton() that is displayed after clicking the "Show".

library(shiny)
ui = shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      actionButton("button1", label = "Show"),
      actionButton("button1b", label = "Hide")

    ),
    mainPanel(
      # what should I write here?
      uiOutput("button2")
    )
  )
))

server = shinyServer(function(input, output, session) {
  observeEvent(input$button1, {
    output$button2 <- renderUI({
      actionButton("button2", label = "Press Button 2")
    })
  })
})
shinyApp(ui = ui, server = server)

CodePudding user response:

One option is to put the second button inside a conditionalPanel and set a toggle to display/hide the panel. See working code below.

library(shiny)
ui = shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      actionButton("button1", label = "Show"),
      actionButton("button1b", label = "Hide")
      
    ),
    mainPanel(
      # what should I write here?
      conditionalPanel(condition = "output.display",
                       actionButton("button2", label = "Press Button 2"))
    )
  )
))

server = shinyServer(function(input, output, session) {
  r <- reactiveValues(
    toggle = NULL
  )
  observeEvent(input$button1, {
    r$toggle = 1
  })
  observeEvent(input$button1b, {
    r$toggle = 0
  })
  output$display <- reactive({
    r$toggle
  })
  outputOptions(output, "display", suspendWhenHidden = FALSE)  
})
shinyApp(ui = ui, server = server)

Another option is to dynamically insert and remove UI elements. But that option requires creation/destruction of UI elements every time the buttons are clicked. See example here

  • Related