Ожидание завершения будущего в Shiny в сочетании с индикатором прогресса

У меня очень длинная задача в R, которая выполняет много вычислений и записывает несколько файлов. Эта функция вызывается из Shiny-reactive. Поскольку это занимает так много времени, я хотел распараллелить его на нескольких процессах, но в то же время я хотел включить индикатор выполнения для конечного пользователя. Я внимательно следил за ответом на этот пост, в котором используется futures: Использование стандартного блестящего индикатора выполнения R в параллельных вычислениях foreach.

Однако: файлы, которые создает моя функция, позже используются для дальнейшей обработки в другом реактиве. Почему-то я не могу позволить этому второму реактивному ожиданию, пока мое будущее полностью не завершится - он уже пытается читать файлы, которых либо еще нет, либо они неполные. Как мне сказать второму реактиву ждать, пока не завершится будущее?

Мой код на данный момент:

library(promises)
library(future)
library(ipc)

plan(multisession)

r1 <- eventReactive(input$go_Button, {
  Runs <- 1:3  #3 parallel runs
  prog <- list()   #Setup for Progressbar
  
  for (j in Runs) {
    prog[[j]] <- AsyncProgress$new(message = "Calculation")
    future_promise({
      for (k in 1:length(rawdata_entries)) {
        prog[[j]]$inc(1 / length(rawdata_entries))
        
        <<< VERY LONG TASK THAT CREATES SEVERAL FILES >>>
          
      }
      prog[[j]]$close()
    }) # end of future_promise
  } # end of for loop
  
  return(list("Done"=TRUE))   
  
}) # end of eventReactive



r2 <- reactive({
  if (r1()$Done == TRUE) {  #my naive approach that doesn't work 
    <<<do some further processing with the files r1() created >>>
    <<< creates the data-frame "some_results" >>>    
  
      return(some_result)
  }
})

Самые важные вещи, которых я хочу достичь:

  • распараллеливать трудоемкие вычисления
  • есть индикатор выполнения для конечного пользователя
  • полностью оценить обещание, прежде чем переходить к дальнейшим действиям

Где моя ошибка (и)?


person shghm    schedule 20.04.2021    source источник
comment
У меня такая же проблема. Я написал вычисления на C ++, поместил их в функцию и использовал пакет Rcpp. Время на вычисления сократилось с 30 минут до минуты. Вы, вероятно, добьетесь большего повышения производительности при использовании Rcpp, чем при распараллеливании.   -  person Eric Krantz    schedule 20.04.2021
comment
Да, я уже пробовал это для части моей проблемы - единственная серьезная проблема заключается в том, что я совершенно не владею C ++ :-). Как будто я с трудом могу написать функцию, которая складывает несколько чисел и умножает все на Пи ...   -  person shghm    schedule 20.04.2021