Я успешно распараллелил функцию — назовем ее AddOne
— с помощью пакета doParallel
, foreach
и %dopar%
, и я знаком с аргументами .packages
и .export
для foreach
.
Моя проблема в том, что я хотел бы, чтобы AddOne
вместо «автономной» функции был элементом списка, и в этом случае я не могу заставить все работать. В частности, если AddOne
вызывает подпрограмму AddOneSubroutine
, то AddOneSubroutine
не будет найдена в «рабочей» среде, даже если она «экспортирована».
Я использую Windows 10 и R.version
выдает:
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 4.1
year 2017
month 06
day 30
svn rev 72865
language R
version.string R version 3.4.1 (2017-06-30)
nickname Single Candle
У меня версия doParallel 1.0.10. Вот некоторый код, демонстрирующий проблему настолько кратко, насколько я мог.
library(doParallel)
if(!exists("Registered")){
registerDoParallel(cores = detectCores(logical = TRUE))
Registered = TRUE
}
AddOne<-function(x){AddOneSubroutine(x)}
AddOneSubroutine <-function(x){x+1}
MyList<-list()
MyList$f<-AddOne
# Not using parallel environments, works correctly when calling AddOne 3 times
Result1 = foreach(i = 1:3) %do% AddOne(i)
Result1
# Not using parallel environments, works correctly when calling MyList$f 3 times
Result2 = foreach(i = 1:3) %do% MyList$f(i)
Result2
# Using parallel environments, works correctly when calling AddOne 3 times,
# despite not explicitly using the .export argument to export AddOneSubroutine
Result3 = foreach(i = 1:3) %dopar% AddOne(i)
Result3
# Using parallel environments, fails when calling MyList$f with error
# "could not find function "AddOneSubroutine"", even though that function is "exported"
Result4 = foreach(i = 1:3,.export = "AddOneSubroutine") %dopar% MyList$f(i)
Result4
Что я не понимаю?