Skip to content

Issue with DataTables using withSpinner() showing up if an error occurs instead of clearing #98

@Mkranj

Description

@Mkranj

I have an app that fetches some data and creates a tabular report. While the data is fetching and calculating, the spinner creates a more pleasant UI. However, I've noticed that if an error in the fetch process happens, instead of clearing the DT, it shows up as the last created DT with the error text overlay. Here's an example:

library(shiny)
library(DT)
library(shinycssloaders)

ui <- fluidPage(
  actionButton("trigger_error", "Trigger an error"),
  actionButton("clear_error", "Clear an error"),
  tagList(dataTableOutput("mytable"),
          uiOutput("extra_info")
  ) %>% withSpinner(type = 5, color = "#d71635")
)

server <- function(input, output, session) {
  
  error_active <- reactiveVal(FALSE)
  
  observeEvent(input$trigger_error, {
    error_active(TRUE)
  })
  observeEvent(input$clear_error, {
    error_active(FALSE)
  })
  
  mydata <- reactive({
    
    # pretend computing data takes some time
    Sys.sleep(0.2)
    
    if (error_active()) stop("Triggered user error.")
    
    data.frame(x = 1:10,
               y = 2:11)
  })
  
  output$mytable <- renderDataTable({
    req(mydata())
    
    input$clear_error
    
    datatable(mydata(), escape = FALSE)
  })
  
  output$extra_info <- renderUI({
    req(mydata())
    tagList(
      h2("Extra information")
    )
  })
  
}

shinyApp(ui, server)

To trigger, press Clear error 3 or 4 times (I'm not sure why this number, sometimes it occurs at 2). It should appear as the table with the error overlaid:

Image

In my work this is especially a problem since the table shows the last succesful report, while the system should be creating a different report.

I'm using shiny 1.11.1, DT 0.33, shinycssloaders 1.1.0.

Some things I've noticed:

  • it seems it's important that the DTOutput is in the tagList, and I can't replicate the error if the spinner's JUST on the dataTableOutput
  • renderDataTable()'s expression needs to have some more reactive components, like input$clear_error

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions