nlminb() не распознает входные данные при внедрении в foreach()

Я хочу провести схему повторной выборки по методу Монте-Карло, используя многоядерные средства, предоставляемые пакетом foreach в сочетании с пакетом doMC, используя машину LINUX. На каждой итерации самодельная функция выполняет повторную выборку с заменой данных, содержащихся в data.frame X. В результате я получаю новый data.frame X.i, содержащий псевдообразец, который используется в качестве входных данных в процесс оптимизации с использованием nlminb() (целевая функция = F_1). У меня не возникло проблем с использованием стандартной команды for():

B=10 # number of iterations in the for(), foreach() loops
ll<-numeric(B) # vector containing the objective value from nlminb() at iteration i.

for (i in 1:B){
               X.i<-f_bwhv(X,resampling=T)
               ll[i]<-nlminb(par,F_1,X.i=X.i)$objective
               }
ll
[1] 55160.06 65839.87 50232.35 74536.11 73489.52 80321.76 61646.76 61899.84 76774.73 74138.7   

Однако я не могу применить foreach(), так как похоже, что nlminb() не распознает входные данные X.i, или по крайней мере не управляет ими так же, как при внедрении в for():

doMC::registerDoMC(cores=2)

ll.foreach<-foreach(i=1:B,.packages = c("stats","plyr"),.combine = c)   %dopar% {
                 X.i<-f_bwhv(X,resampling=T)
                 nlminb(par,F_1,X.i=X.i)$objective
                }

Error in { : task 1 failed - "object 'X.i' not found"

Я не знаю, в чем проблема, но я предполагаю, что это должно быть что-то конкретное, связанное с тем, как взаимодействуют foreach() и nlminb(), потому что если я запущу foreach() с простой функцией, скажем, измерю количество строк в Xi, я не получу проблема вообще:

nrows.foreach<-foreach(i=1:B, .packages = c("stats","plyr"), .combine = c) %dopar% { 
                 X.i<-f_bwhv(X,resampling=T)
                 nrow(X.i)
                 }

nrows.foreach
118 118 116 116 118 117 116 115 108 113 

Я не знаком с пакетом foreach, и мне не удалось найти решение в справке по пакету, поэтому буду признателен за ваши предложения.

Я использовал здесь:

R версия 3.3.0 (03.05.2016); doMC версии 1.3.4; foreach версии 1.4.3; Платформа: x86_64-pc-linux-gnu (64-разрядная версия)


person jrs-x    schedule 19.01.2017    source источник


Ответы (1)


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

F_1<-function(par,...){*some calculations involving par and X.i* }

используя ,..., чтобы передать X.i в функцию. Это всегда работало для меня в других процедурах. Решение пришло, просто изменив заголовок функции следующим образом:

F_1<-function(par,X.i){*some calculations involving par and X.i* }

Ваше здоровье

person jrs-x    schedule 23.01.2017