Async processing in Shiny is supposed to take a long-running function and give control back to the user. However, it would still be nice to let the user know that the computation is running in the background. I cannot figure out how to structure the async process to run in the background and still display a progress indicator. Below is the example code I've been fiddling with. I think the progress indicator is one issue, but also the creation of the table doesn't seem to be working with async processing.
library(shiny) library(future) library(promises) plan(multiprocess) shinyApp( ui = basicPage( tableOutput('table'), actionButton('goTable', 'Go table') ), server = function(input, output, session) { table_data <- reactive({ # make reactive to button click input$goTable # Create a Progress object progress <- shiny::Progress$new() progress$set(message = "Building Table", value = 0) # Close the progress when this reactive exits (even if there's an error) on.exit(progress$close()) # build up the table data future({ this_dat <- NULL for(i in 1:5){ Sys.sleep(1) this_dat <- rbind(this_dat, data.frame(i=i)) # increment progress progress$inc(1/5) } }) return(this_dat) }) output$table <- renderTable({ table_data() }) } )