2015-07-26 2 views
1

При выполнении следующей фиктивный код:R Еогеасп параллельный цикл не сохраняется

P = 2 
library(foreach) 
library(doMC) 
registerDoMC(P)  
f = double(length = P) 

print('=== f values in loop ===') 
foreach(c = 1:P) %dopar% 
{ 
    f[c] = c 
    print(f[c]) 
} 

print('### f values after loop ###') 
for(c in 1:P){ print(f[c]) } 

я получаю следующий результат:

"=== f values in loop ===" 
1 
2 
"### f values after loop ###" 
0 
0 

Почему же f значения, присвоенные в цикле foreach не сохраняются?

В частности, почему f[1] и f[2] равны нулю после цикла foreach?

Спасибо!

ответ

2

У вас есть две проблемы в вашем коде:

  1. Вы не назначенную результат foreach() к объекту.
  2. Функция foreach не возвращает значение. (Строго говоря, функция возвращает значение print() которое NULL.)

Использование

f <- foreach(c = 1:P) %dopar% { c } 

Важное различие между for() в базовой R и foreach() является то, что все, что вы делаете внутри for() доступен в родительская среда for(). Тем не менее, foreach() является функцией, и что-либо внутри функции foreach() является локальным для среды функций.

В некотором смысле foreach() больше похож на lapply(), чем на for().

+0

Спасибо Andrie, это сработало! Как раз один вопрос, как задать два аргумента (например, f и g) как вывод из foreach()? Я совершенно новичок в R. – user233558

+0

Nevermind, нашел его здесь: http://stackoverflow.com/questions/19791609/saving-multiple-outputs-of-foreach-dopar-loop – user233558

Смежные вопросы