Search code examples
shinyshinyjsautoresetevent

Shiny actionbutton to set a customized default


In this shiny App (code below), I need that the button labeled 'Customized' returns:

  • Select var X: disp
  • Select var Y: drat
  • Point size: 1.0

This necessity is a bit similar to the reset button available on the R package 'shinyjs', with the diference of that the reset button returns to the code's default.

library(shiny)
library(shinyjs)

shinyApp(
  ui <- fluidPage(
    
    sidebarPanel(
      fluidRow(
        shinyjs::useShinyjs(),
        id = "panel_vars",
        # Buttons
        uiOutput("varx"),
        uiOutput("vary"),
        numericInput("ptSize", "Point size",
                     min=.1, max=5, value = 2),
        actionButton("p1", 'Reset variables XY'),
        helpText(""),
        actionButton("p2", 'Customized')
      )
    ),
    
    mainPanel(
      plotOutput("plot")
    )
  ),
  
  server <- function(input, output) {
    
    getModel <- reactive({
      names(mtcars)
    })
    
    output$varx <- renderUI({
      selectInput("varsel.x", "Select var X",
                  choices = as.list(getModel()), multiple = F)
    })
    
    output$vary <- renderUI({
      selectInput("varsel.y", "Select var Y",
                  choices = as.list(getModel()), multiple = F)
      
    })
    
    observeEvent(input$p1, {
      shinyjs::reset("panel_vars")
    })
    
    output$plot <- renderPlot({
      
      p <- mtcars %>% ggplot(aes_string(x=input$varsel.x, y=input$varsel.y))+
        geom_point(size=input$ptSize)
      
      p
      
    })
  }
)

Solution

  • You can simply use updateSelectInput and updateNumericInput to do so:

    library(shiny)
    library(shinyjs)
    library(dplyr)
    library(ggplot2)
    
    shinyApp(
      ui <- fluidPage(
        
        sidebarPanel(
          fluidRow(
            shinyjs::useShinyjs(),
            id = "panel_vars",
            # Buttons
            uiOutput("varx"),
            uiOutput("vary"),
            numericInput("ptSize", "Point size",
                         min=.1, max=5, value = 2),
            actionButton("p1", 'Reset variables XY'),
            helpText(""),
            actionButton("p2", 'Customized')
          )
        ),
        
        mainPanel(
          plotOutput("plot")
        )
      ),
      
      server <- function(input, output,session) {
        
        getModel <- reactive({
          names(mtcars)
        })
        
        output$varx <- renderUI({
          selectInput("varsel.x", "Select var X",
                      choices = as.list(getModel()), multiple = F)
        })
        
        output$vary <- renderUI({
          selectInput("varsel.y", "Select var Y",
                      choices = as.list(getModel()), multiple = F)
          
        })
        
        observeEvent(input$p1, {
          shinyjs::reset("panel_vars")
        })
        
        output$plot <- renderPlot({
          req(input$varsel.x,input$varsel.y,input$ptSize)
          
          p <- mtcars %>% ggplot(aes_string(x=input$varsel.x, y=input$varsel.y))+
            geom_point(size=input$ptSize)
          
          p
          
        })
        
        observeEvent(input$p2, {
          updateSelectInput(session,'varsel.x',selected = 'disp')
          updateSelectInput(session,'varsel.y',selected = 'drat')
          updateNumericInput(session, "ptSize", value = 1.0)
        })
     
      }
    )
    

    enter image description here