The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

loadingButton and showToast

Andy Merlino

2021-09-23

loadingButton

loadingButton is similar to shiny::actionButton() but, when clicked, it changes styles to resemble a loading state. Your Shiny app can then make some calculations or execute some database queries while the button is in this loading state. Once your app is done loading, call resetLoadingButton() to restore the loading button to an active state.

library(shiny)
library(shinyFeedback)

ui <- fluidPage(
  fluidRow(
    column(
      12,
      br(),
      loadingButton(
        "myLoadingButton", 
        label = "Submit"
      ),
      loadingButton(
        "myCancelButton", 
        label = "Cancel",
        class = "btn btn-danger",
        loadingLabel = "Cancelling...",
      )
    )
  )
)

server <- function(input, output, session) {
  
  
  # reset the loadingButton to its active state after 3 seconds
  observeEvent(input$myLoadingButton, {
    Sys.sleep(3)
    resetLoadingButton("myLoadingButton")
  })
  
  observeEvent(input$myCancelButton, {
    Sys.sleep(3)
    resetLoadingButton("myCancelButton")
  })
  
}


shinyApp(ui, server)

showToast

Show a toast notification. showToast() wraps the JavaScript toastr library. To use showToast() include useShinyFeedback() at the top of your ui. If you only want to use the toasts you can set the “feedback” argument to FALSE to only include css and js for the toasts.

library(shiny)
library(shinyFeedback)

ui <- fluidPage(
  useShinyFeedback(feedback = FALSE),
  fluidRow(
    column(
      12,
      br(),
      loadingButton(
        "myFirstButton", 
        label = "Submit"
      )
    )
  )
)

server <- function(input, output, session) {
  
  
  # reset the loadingButton to its active state after 2 seconds
  observeEvent(input$myFirstButton, {
    Sys.sleep(2)
    resetLoadingButton("myFirstButton")
    showToast(
      "success", 
      "I'll toast to that!"
    )
  })
  
}

shinyApp(ui, server)

shinyFeedback is not the first R package to wrap the toastr JavaScript library. The shinytoastr package did this years ago. The main difference between the shinyFeedback::showToast() implementation and shinytoastr’s is that we supply a “.options” argument rather than having an argument for each toastr option. This allows you to more easily set global toast options. e.g.

# use this list for all your toasts
myToastOptions <- list(
  positionClass = "toast-top-right",
  progressBar = FALSE,
  timeOut = 3000,
  closeButton = TRUE,

  # same as defaults
  newestOnTop = TRUE,
  preventDuplicates = FALSE,
  showDuration = 300,
  hideDuration = 1000,
  extendedTimeOut = 1000,
  showEasing = "linear",
  hideEasing = "linear",
  showMethod = "fadeIn",
  hideMethod = "fadeOut"
)


library(shiny)
library(shinyFeedback)

ui <- fluidPage(
  useShinyFeedback(feedback = FALSE),
  fluidRow(
    column(
      12,
      br(),
      loadingButton(
        "myLoadingButton", 
        label = "Submit"
      ),
      loadingButton(
        "myErrorButton", 
        label = "Error",
        class = "btn btn-danger",
        loadingLabel = "Erroring...",
      )
    )
  )
)

server <- function(input, output, session) {
  
  
  # reset the loadingButton to its active state after 2 seconds
  observeEvent(input$myLoadingButton, {
    Sys.sleep(2)
    resetLoadingButton("myLoadingButton")
    showToast(
      "success", 
      "I'll toast to that!", 
      .options = myToastOptions
    )
  })
  
  observeEvent(input$myErrorButton, {
    Sys.sleep(2)
    resetLoadingButton("myErrorButton")
    showToast(
      "error", 
      "Your toast is on fire!", 
      .options = myToastOptions
    )
  })
  
}




shinyApp(ui, server)

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.