Search code examples
shinyresetaction-button

How to reset verbatimTextOutput repeatedly by clicking the reset action button? (on using uiOutput & renderUI we can't generate verbatimTextOutput)


ui <- fluidPage( sidebarPanel( checkboxGroupInput("predictors_1", "Select Predictor variables for Model 1", names(df[,3:8])), # some data frame

        actionButton("generate_1", "Generate", class = "btn-success"),
               
        actionButton("reset_1", "Reset", class = "btn-danger"),
               
        width = 3,
        position="left"
               
     )

      mainPanel(
             
             fluidRow(
                    column(width = 6,
                    verbatimTextOutput("model_1_summary"),
                     ),
                    column(width = 6,
                    verbatimTextOutput("model_2_summary")
                     )
                )

)

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

       rv1 <- reactiveValues()
       
       # Functionality for Generate button
       rv1$model_1_formula <- eventReactive(input$generate_1, {
                                                   reformulate( termlabels = input$predictors_1,
                                                   response = "Precipitation")})
  
 
# Printing Model 1 Summary

output$model_1_summary <- renderPrint(tryCatch(summary(lm(formula = rv1$model_1_formula(),
                                                 data = training_set)),
                       error = function(e) print("Select at least one Predictor and click Generate!")))                

# Functionality for Reset Button
observeEvent(input$reset_1, {
             updateTextInput(session, "predictors_1", value = "")                                 
                             
             rv1$model_1_formula <- eventReactive(input$generate_1, {
               reformulate( termlabels = input$predictors_1,
                                         response = "Precipitation")})
})

}

My code is working in the following manner:

  1. I select the predictor variables
  2. Click on Generate button.
  3. Model summary is printed.
  4. I click on reset button.
  5. The inputs are updated to "", but the renderPrint output does not go away.
  6. Goto Step 1.

So the code is working but its not complete yet. Any help will be immensely appreciated.


Solution

  • This code should have the functionality you want.

    I fixed a few things, and removed the tryCatch() statement, since it's better to explicitly prevent errors than catch them. I also created some very basic example data to test the program.

    library(shiny)
    
    df <- as.data.frame(as.list(1:8))
    names(df) <- letters[1:8]
    df$Precipitation <- 9
    training_set <- df
    
    ui <- fluidPage( 
      sidebarPanel( 
        checkboxGroupInput("predictors_1", "Select Predictor variables for Model 1", names(df[,3:8])), # some data frame
        actionButton("generate_1", "Generate", class = "btn-success"),
        actionButton("reset_1", "Reset", class = "btn-danger"),
        width = 3,
        position="left"
      ),
      mainPanel(
        fluidRow(
          column(
            width = 6,
            verbatimTextOutput("model_1_summary"),
          ),
          column(
            width = 6,
            verbatimTextOutput("model_2_summary")
          )
        )
      )
    )
    
    server <- function(input, output, session) {
      rv1 <- reactiveValues()
      
      # Functionality for Generate button
      observeEvent(input$generate_1, {
        if (length(input$predictors_1) > 0) {
          rv1$model_1_formula <- reformulate(
            termlabels = input$predictors_1,
            response = "Precipitation"
          )
        } else {
          # Signal to output$model_1_summary that no predictors were selected.
          rv1$model_1_formula <- NULL
        }
      })
      
      # Printing Model 1 Summary
      output$model_1_summary <- renderPrint({
        if (is.null(rv1$model_1_formula)) {
          cat("Select at least one Predictor and click Generate!")
        } else {
          summary(lm(formula = rv1$model_1_formula,
                     data = training_set))
        }
      })                
      
      # Functionality for Reset Button
      observeEvent(input$reset_1, {
        updateTextInput(session, "predictors_1", value = "")                                 
        
        # Revert the model_1_summary back to the original message
        rv1$model_1_formula <- NULL
      })
    }
    
    shinyApp(ui, server)