rshinyshiny-reactivity

How to reset value of numericInput when user clicks Default radio Button


In my app, the user can choose to apply either a Default or Custom Value. If the user selects 'Custom', the numericInput boxes are enabled and can be changed. If the user goes back and selects 'Default', I would like the values in the numericInput boxes to be reset to their default values. I would like to do this without having to add a separate action button if this is possible.

library(shiny)
library(shinydashboard)
library(shinyjs)

opts.adv <- c("Default","Custom")

ui <- dashboardPage(skin = "blue",
  dashboardHeader(title = "Survival Analysis",titleWidth = 450),
  dashboardSidebar(id="",
             sidebarMenu(id = "tabs",
                 menuItem("Survival",tabName = "menuSurvival", icon = shiny::icon("skull-crossbones")),
                 actionButton("btnQuit","Quit",icon = shiny::icon("xmark"),class="btn-lg btn-danger"))),
  dashboardBody(
    useShinyjs(),
     tabItems(
         tabItem(tabName = "menuSurvival",
                    fluidRow(column(4,style="width:25%;",
                                    box(title="Survival",status="primary",solidHeader=TRUE,width=NULL,
                                        radioButtons("adv.sel","Survival options",opts.adv),
                                        numericInput("mu.custom","Mean (default = 0.1)",0.1,min=0,max=2,step=0.01),
                                        numericInput("var.custom","Variance (default = 0.05)",0.05,min=0,max=0.5,step=0.01)))))
)))

server <- function(input, output, session) {

  observeEvent(input$adv.sel, {
    if (input$adv.sel == "Default") {
      shinyjs::disable(id = "mu.custom")
      shinyjs::disable(id = "var.custom")
    } else {
      shinyjs::enable(id = "mu.custom")
      shinyjs::enable(id = "var.custom")
    }
  })

  observeEvent(input$btnQuit, {
    stopApp()
  })

}

shinyApp(ui, server)enter code here

Solution

  • You can simply add reset

    library(shiny)
    library(shinydashboard)
    library(shinyjs)
    
    opts.adv <- c("Default","Custom")
    
    ui <- dashboardPage(skin = "blue",
                        dashboardHeader(title = "Survival Analysis",titleWidth = 450),
                        dashboardSidebar(id="",
                                         sidebarMenu(id = "tabs",
                                                     menuItem("Survival",tabName = "menuSurvival", icon = shiny::icon("skull-crossbones")),
                                                     actionButton("btnQuit","Quit",icon = shiny::icon("xmark"),class="btn-lg btn-danger"))),
                        dashboardBody(
                          useShinyjs(),
                          tabItems(
                            tabItem(tabName = "menuSurvival",
                                    fluidRow(column(4,style="width:25%;",
                                                    box(title="Survival",status="primary",solidHeader=TRUE,width=NULL,
                                                        radioButtons("adv.sel","Survival options",opts.adv),
                                                        numericInput("mu.custom","Mean (default = 0.1)",0.1,min=0,max=2,step=0.01),
                                                        numericInput("var.custom","Variance (default = 0.05)",0.05,min=0,max=0.5,step=0.01)))))
                          )))
    
    server <- function(input, output, session) {
      
      observeEvent(input$adv.sel, {
        if (input$adv.sel == "Default") {
          shinyjs::disable(id = "mu.custom")
          shinyjs::disable(id = "var.custom")
          reset(id = "mu.custom", asis = FALSE)
          reset(id = "var.custom", asis = FALSE)
        } else {
          shinyjs::enable(id = "mu.custom")
          shinyjs::enable(id = "var.custom")
        }
      })
      
      observeEvent(input$btnQuit, {
        stopApp()
      })
      
    }
    
    shinyApp(ui, server)
    

    Or updateNumericInput to update both inputs to default everytime the user clicks back on default.

    library(shiny)
    library(shinydashboard)
    library(shinyjs)
    
    opts.adv <- c("Default","Custom")
    
    ui <- dashboardPage(skin = "blue",
                        dashboardHeader(title = "Survival Analysis",titleWidth = 450),
                        dashboardSidebar(id="",
                                         sidebarMenu(id = "tabs",
                                                     menuItem("Survival",tabName = "menuSurvival", icon = shiny::icon("skull-crossbones")),
                                                     actionButton("btnQuit","Quit",icon = shiny::icon("xmark"),class="btn-lg btn-danger"))),
                        dashboardBody(
                          useShinyjs(),
                          tabItems(
                            tabItem(tabName = "menuSurvival",
                                    fluidRow(column(4,style="width:25%;",
                                                    box(title="Survival",status="primary",solidHeader=TRUE,width=NULL,
                                                        radioButtons("adv.sel","Survival options",opts.adv),
                                                        numericInput("mu.custom","Mean (default = 0.1)",0.1,min=0,max=2,step=0.01),
                                                        numericInput("var.custom","Variance (default = 0.05)",0.05,min=0,max=0.5,step=0.01)))))
                          )))
    
    server <- function(input, output, session) {
      
      observeEvent(input$adv.sel, {
        if (input$adv.sel == "Default") {
          shinyjs::disable(id = "mu.custom")
          shinyjs::disable(id = "var.custom")
          
          updateNumericInput(session, "mu.custom", value = 0.1)
          updateNumericInput(session, "var.custom", value = 0.05)
        } else {
          shinyjs::enable(id = "mu.custom")
          shinyjs::enable(id = "var.custom")
        }
      })
      
      observeEvent(input$btnQuit, {
        stopApp()
      })
      
    }
    
    shinyApp(ui, server)
    

    and both will give

    out