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
цикл?
Спасибо!
1 ответ
Решение
У вас есть две проблемы в вашем коде:
- Вы не присвоили результат
foreach()
к объекту. foreach
функция не возвращает значение. (Строго говоря, функция возвращает значениеprint()
который равен NULL.)
использование
f <- foreach(c = 1:P) %dopar% { c }
Важное различие между for()
в базе R и foreach()
это то, что вы делаете внутри for()
доступен в родительской среде for()
, Тем не мение, foreach()
это функция и что-нибудь внутри foreach()
Функция является локальной для функциональной среды.
В некотором смысле foreach()
больше похоже на lapply()
чем for()
,