Асинхронная обработка в Shiny должна принимать длительную функцию и возвращать управление пользователю. Тем не менее, было бы неплохо сообщить пользователю, что вычисления выполняются в фоновом режиме. Я не могу понять, как структурировать асинхронный процесс для запуска в фоновом режиме и при этом отображать индикатор выполнения. Ниже приведен пример кода, с которым я возился. Я думаю, что индикатор прогресса - это одна из проблем, но создание таблицы, похоже, не работает с асинхронной обработкой.
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()
})
}
)