Последовательное обновление индикатора выполнения с параллельной обработкой

У меня есть вложенный вызов 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)
}

0 ответов

Другие вопросы по тегам