Home > Back-end >  R Shiny - Hiding an Output When a Value Changes
R Shiny - Hiding an Output When a Value Changes

Time:02-18

I Would like to make a form type Shiny app where the output is shown when a user clicks and action button, but the output is subsequently hidden if an input values changes.

Here is an example:

library(shiny)
library(shinyjs)

ui <- fluidPage(
  radioButtons("myRadioButton", label = h4("Radio Input"),
               choices = list("A" = 0,
                              "B" = 1,
                              "C" = 2),
               selected = character(0)),
  
  numericInput("myNumericInput", label = h4("Numeric Input"),
               value = NA, min = 0, max = 50, step = 1),
  
  actionButton("submit", "Submit"),
  
  textOutput("myOutput")
)


server <- function(input, output, session){
  
  score <- reactive({
    scoreOut <- paste(input$myRadioButton, input$myNumericInput)
    })
  
  observeEvent(input$myRadioButton, {
    hide("myOutput")
    })
  
  observeEvent(input$myNumericInput, {
    hide("myOutput")
  })
  
  observeEvent(input$submit, {
    show("myOutput")
    output$myOutput <- renderText({
      paste("This is your value:", score())
    })
  })
  
}

shinyApp(ui, server)

So in the above example the output displays after "Submit" is clicked. What I would like is if you go back and change say the radio or numeric input, the output disappears until "Submit" is clicked again.

CodePudding user response:

You missed the useShinyjs() in the UI to load the JavaScript required to execute the hide function:

library(shiny)
library(shinyjs)

ui <- fluidPage(

  # load required Java Script
  useShinyjs(),

  radioButtons("myRadioButton",
    label = h4("Radio Input"),
    choices = list(
      "A" = 0,
      "B" = 1,
      "C" = 2
    ),
    selected = character(0)
  ),
  numericInput("myNumericInput",
    label = h4("Numeric Input"),
    value = NA, min = 0, max = 50, step = 1
  ),
  actionButton("submit", "Submit"),
  textOutput("myOutput")
)


server <- function(input, output, session) {
  score <- reactive({
    scoreOut <- paste(input$myRadioButton, input$myNumericInput)
  })

  observeEvent(input$myRadioButton, {
    hide("myOutput")
  })

  observeEvent(input$myNumericInput, {
    hide("myOutput")
  })

  observeEvent(input$submit, {
    show("myOutput")
    output$myOutput <- renderText({
      paste("This is your value:", score())
    })
  })
}

shinyApp(ui, server)

  • Related