Ошибка параллельной обработки с foreach: не удалось найти функцию% dopar%

У меня проблемы с параллельной обработкой с использованием функции foreach в R.

Следующий код отлично работает:

library(foreach)
library(doParallel)

city_list <- c("city1", "city2")
date_list <- c("date1", "date2")

city_date_list <- foreach(city=city_list, .combine='c') %do% {
  foreach(date = date_list, .combine='c') %do% {
  city_date <- paste(city, date)
  city_date
}
}
print(city_date_list)

[1] "city1 date1" "city1 date2" "city2 date1" "city2 date2"

Однако, когда я пытаюсь перейти с% do% на% dopar%, код начинает выдавать ошибки. Это обновленный код для параллельной обработки

library(foreach)
library(doParallel)

city_list <- c("city1", "city2")
date_list <- c("date1", "date2")
myCluster <- makeCluster(4, type="PSOCK")
registerDoParallel(myCluster)


city_date_list <- foreach(city=city_list, .combine='c') %dopar% {
  foreach(date = date_list, .combine='c') %dopar% {
    city_date <- paste(city, date)
    city_date
  }
}

stopCluster(myCluster)

print(city_date_list)

Это результат сгенерированный

> city_date_list <- foreach(city=city_list, .combine='c') %dopar% {
+   foreach(date = date_list, .combine='c') %dopar% {
+     city_date <- paste(city, date)
+     city_date
+   }
+ }
Error in { : task 1 failed - "could not find function "%dopar%""
> 
> stopCluster(myCluster)
> 
> print(city_date_list)
Error in print(city_date_list) : object 'city_date_list' not found

Я не уверен, в чем ошибка. Это подробности сеанса, который я провожу.

> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_India.1252  LC_CTYPE=English_India.1252    LC_MONETARY=English_India.1252
[4] LC_NUMERIC=C                   LC_TIME=English_India.1252    

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] doParallel_1.0.11 iterators_1.0.9   foreach_1.4.4    

loaded via a namespace (and not attached):
[1] compiler_3.4.3   magrittr_1.5     tools_3.4.3      yaml_2.1.18      stringi_1.1.7    codetools_0.2-15 knitr_1.20      
[8] stringr_1.3.0   

Есть идеи, как это исправить?


person Arpit    schedule 01.09.2018    source источник
comment
Вам нужно экспортировать функции и объекты. Попробуйте вместо этого использовать doFuture.   -  person pogibas    schedule 01.09.2018
comment
Как сказал @PoGibas, вам нужно экспортировать глобальные объекты, если вы используете foreach в функции. См. Пример этого в виньетке doFuture, раздел о doFuture заботится о глобальных переменных для foreach.   -  person phiver    schedule 01.09.2018


Ответы (2)


При вложении foreach циклов вы должны использовать оператор вложенности %:% для всех циклов, кроме одного. Псевдокод:

foreach (...) %:%
    foreach (...) %dopar%
        ....

Дополнительную информацию см. В виньетке с вложением.

person Ralf Stubner    schedule 01.09.2018
comment
@Arpit Пожалуйста. Пожалуйста, примите / проголосуйте за ответ так, как считаете нужным, ср. stackoverflow.com/help/someone-answers. - person Ralf Stubner; 03.09.2018

Если вы хотите использовать дополнительные библиотеки в foreach-цикле, вы должны экспортировать их на параллельные узлы кластера. Следовательно, вы должны использовать параметр .export в вызове функции foreach:

city_date_list <- foreach(city=city_list, .combine='c', 
                          .packages = c("foreach") # this does the trick
                          ) %dopar% {
  foreach(date = date_list, .combine='c') %dopar% {
    city_date <- paste(city, date)
    city_date
  }
}

Как мы узнаем из ?foreach:

.packages -> вектор символов пакетов, от которых зависят задачи. Если ex требует загрузки пакета R, эту опцию можно использовать для загрузки этого пакета на каждом из рабочих процессов. Игнорируется при использовании с %do%.

Таким образом, это происходит не в вашем первом примере, а во втором (с использованием параллельности).

Однако я не совсем уверен, нужен / полезен вложенный foreach.

person loki    schedule 01.09.2018