Search code examples
rif-statementshinyobservers

Use one if() instead of multiple observeEvent() to display message in a shiny app


I have the shiny app below in which I use three observers which are activated based on the actionbuttons. I was wondering how I could replace those observers with an if() that would include all 3 conditions inside.

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  tags$h2("Sweet Alert examples"),
  actionButton(
    inputId = "success",
    label = "Launch a success sweet alert",
    icon = icon("check")
  ),
  actionButton(
    inputId = "error",
    label = "Launch an error sweet alert",
    icon = icon("remove")
  ),
  actionButton(
    inputId = "sw_html",
    label = "Sweet alert with HTML",
    icon = icon("thumbs-up")
  )
)

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

  observeEvent(input$success, {
    sendSweetAlert(
      session = session,
      title = "Success !!",
      text = "All in order",
      type = "success"
    )
  })

  observeEvent(input$error, {
    sendSweetAlert(
      session = session,
      title = "Error !!",
      text = "It's broken...",
      type = "error"
    )
  })

  observeEvent(input$sw_html, {
    sendSweetAlert(
      session = session,
      title = NULL,
      text = tags$span(
        tags$h3("With HTML tags",
                style = "color: steelblue;"),
        "In", tags$b("bold"), "and", tags$em("italic"),
        tags$br(),
        "and",
        tags$br(),
        "line",
        tags$br(),
        "breaks",
        tags$br(),
        "and an icon", icon("thumbs-up")
      ),
      html = TRUE
    )
  })

}

shinyApp(ui, server)

Solution

  • You could just call a helper function to do what you want after you get the event

    server <- function(input, output, session) {
    
      observeEvent(input$success, {sendMessage("success")})
      observeEvent(input$error, {sendMessage("error")})
      observeEvent(input$sw_html, {sendMessage("sw_html")})
    
      sendMessage <- function(type) {
        if (type=="success") {
         sendSweetAlert(
            session = session,
            title = "Success !!",
            text = "All in order",
            type = "success"
          )
       } else if (type=="error") {
          sendSweetAlert(
            session = session,
            title = "Error !!",
            text = "It's broken...",
            type = "error"
          )
       } else if (type="sw_html") {
         sendSweetAlert(
            session = session,
            title = NULL,
            text = tags$span(
              tags$h3("With HTML tags",
                      style = "color: steelblue;"),
              "In", tags$b("bold"), "and", tags$em("italic"),
              tags$br(),
              "and",
              tags$br(),
              "line",
              tags$br(),
              "breaks",
              tags$br(),
              "and an icon", icon("thumbs-up")
            ),
            html = TRUE
          )
       }
      }
    }