Последовательное обновление индикатора выполнения с параллельной обработкой
У меня есть вложенный вызов
future_lapply
который обрабатывает параллельно. Работает отлично и быстро!
Проблема в том, что сообщать о последовательном прогрессе в Shiny оказывается сложно. Следующее приложение Shiny имеет индикатор выполнения, который вместо увеличения, например 1, 2,3 и т. д., увеличивается не по порядку, например 1, 5, 2 и т. д.
Любые идеи о том, как сообщать о прогрессе по порядку (даже если обработка не работает)? Простое увеличение счетчика не работает (
increment <- 0; increment <- increment + 1
) из-за правил области видимости.
Переключение на
plan(multisession)
увеличивается в ожидаемом порядке, но это устраняет параллельную обработку.
library(shiny)
library(future)
library(future.apply)
library(ipc)
library(callr)
plan(list(callr, tweak(multisession, workers = availableCores() -1)))
ui <- fluidPage(
actionButton("run","Run"),
tableOutput("dataset")
)
server <- function(input, output, session) {
dat <- reactiveVal()
observeEvent(input$run, {
progress <- AsyncProgress$new(session, min=1, max=15)
future({
future.apply::future_lapply(1:15, function(i){
progress$set(value = i, message = paste("Iteration:",i))
Sys.sleep(0.5)
})
progress$close()
cars
}) %...>% dat
NULL
})
output$dataset <- renderTable({
req(dat())
})
}
shinyApp(ui, server)
}