R значение параллельного цикла foreach не сохраняется

При выполнении следующего фиктивного кода:

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?

Спасибо!


person user233558    schedule 26.07.2015    source источник


Ответы (1)


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

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

Использовать

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

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

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

person Andrie    schedule 26.07.2015
comment
Спасибо, Андрей, получилось! Только один дополнительный вопрос: как назначить два аргумента (например, f и g) в качестве вывода foreach()? Я совсем новичок в Р. - person user233558; 26.07.2015
comment
Неважно, нашел это здесь: stackoverflow .com/questions/19791609/ - person user233558; 26.07.2015