Пакет doParallel является расширением параллельного пакета, как показано в документации здесь.
https://cran.r -project.org / web / packages / doParallel / doParallel.pdf
Читая документацию параллельного пакета, мы видим, что он реализует 3 различных метода для достижения параллелизма.Помните, что R - это однопоточный язык.
- Новый сеанс R, в котором родительский процесс взаимодействует с рабочим или дочерним процессом.
- Через Forking
- ИспользованиеСредства уровня ОС
Вы можете найти эту информацию здесь,
https://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf
Следствием этого является то, что дочерний процесс не можетсвязаться с родительским процессом, пока он не завершит вычисления и не вернет значение.Насколько мне известно.
Следовательно, отметка индикатора выполнения в рабочем процессе невозможна.
Полное раскрытие, я не работал с пакетом doParallel и документациейв отношении блеска было ограничено.
Альтернативное решение
Существует аналогичный пакет, однако с обширной документацией в отношении блеска.Это пакеты futures
и promises
и ipc
.futures
и promises
включают асинхронное программирование, а ipc
включает межпроцессное взаимодействие.Чтобы помочь нам еще больше, он также имеет функцию AsyncProgress()
.
Вот пример, где мы отмечаем два счетчика синхронно.
Пример
library(shiny)
library(future)
library(promises)
library(ipc)
plan(multisession)
ui <- fluidPage(
actionButton(inputId = "go", label = "Launch calculation")
)
server <- function(input, output, session) {
observeEvent(input$go, {
progress = AsyncProgress$new(message="Complex analysis")
future({
for (i in 1:15) {
progress$inc(1/15)
Sys.sleep(0.5)
}
progress$close()
return(i)
})%...>%
cat(.,"\n")
Sys.sleep(1)
progress2 = AsyncProgress$new(message="Complex analysis")
future({
for (i in 1:5) {
progress2$inc(1/5)
Sys.sleep(0.5)
}
progress2$close()
return(i)
})%...>%
cat(.,"\n")
NULL
})
}
shinyApp(ui = ui, server = server)
Ваш код адаптирован
Вот код, который вы написали, слегка модифицированный для выделения многих асинхронных процессов.Любая работа может быть выполнена на рабочем месте, например, созданный вами вектор и добавление rnorm
тоже.(Здесь не показано)
library(shiny)
library(future)
library(promises)
library(ipc)
plan(multisession)
ui <- fluidPage(
actionButton(inputId = "go", label = "Launch calculation")
)
server <- function(input, output, session) {
observeEvent(input$go, {
Runs=c(1:4) #define the number of runs
progress = list() #A list to maintain progress for each run
for(j in Runs){
progress[[j]] = AsyncProgress$new(message="Complex analysis")
future({
for (i in 1:10) {
progress[[j]]$inc(1/10)
Sys.sleep(0.2)
}
progress[[j]]$close()
return(i)
})%...>%
cat(.,'\n')
}
NULL
})
}
shinyApp(ui = ui, server = server)
Приведенный выше код является модифицированной версией кода, найденного в документации по ipc здесь:
http://htmlpreview.github.io/?https://github.com/fellstat/ipc/blob/master/inst/doc/shinymp.html
Дополнительные ресурсы:
https://rstudio.github.io/promises/articles/overview.html