Здесь необходимо рассмотреть две вещи: как вложить параллельные циклы foreach()
в целом, и как решить эту конкретную проблему.
Решение для размещения параллельных циклов foreach()
исходит от @Carlos Santillan'sответ ниже, и это основано на виньетке, которую можно найти здесь .Допустим, у нас есть один внутренний цикл, вложенный во внешний цикл, аналогично описанной выше проблеме, однако вместо параллельного вызова run.jags
у нас есть параллельный foreach()
вызов:
outer_list <- list()
#begin outer loop:
outer_list <-
foreach(i = 1:length(some_index)) %:% {
#grab something to feed next foreach loop.
to_inner <- grab_data[[i]]
#Do something in a nested foreach loop.
inner_list <- list()
#begin inner loop:
inner_list <-
foreach(k = 1:some_index) %dopar% {
#do some other function.
out_inner <- some_function(to_inner)
return(out_inner)
}
out_outer <- some_function(out_inner)
return(out_outer)
}
Ключиспользование оператора %:%
во внешнем цикле и оператора %dopar%
во внутреннем цикле.
Однако это не решит вышеуказанную параллельную проблему run.jags()
, поскольку она не является вложенной foreach()
петля.Чтобы решить эту конкретную вложенную проблему run.jags()
, я изменил настройку method
в run.jags на method=parallel
вместо method=rjparallel
.run.jags()
имеет несколько различных параллельных реализаций, и эта конкретная, похоже, работает на основе моего анализа синхронизации.Надеемся, что в будущем будет более точный ответ на вопрос , почему это работает.Я просто знаю, что это работает.