R foreach并行循环值未保存
R foreach parallel loop value not saved
执行以下虚拟代码时:
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
为什么在 foreach
循环中分配的 f
值未保存?
特别是,为什么 f[1]
和 f[2]
在 foreach
循环后等于零?
谢谢!
您的代码有两个问题:
- 您尚未将
foreach()
的结果分配给对象。
foreach
函数没有 return 值。 (严格来说,函数 return 是 print()
的值为 NULL。)
使用
f <- foreach(c = 1:P) %dopar% { c }
基础 R 中的 for()
和 foreach()
之间的重要区别在于,您在 for()
中所做的任何事情都可以在 for()
的父环境中使用。但是,foreach()
是一个函数,foreach()
函数内部的任何内容对于函数环境都是本地的。
在某种意义上,foreach()
比 for()
更类似于 lapply()
。
执行以下虚拟代码时:
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
为什么在 foreach
循环中分配的 f
值未保存?
特别是,为什么 f[1]
和 f[2]
在 foreach
循环后等于零?
谢谢!
您的代码有两个问题:
- 您尚未将
foreach()
的结果分配给对象。 foreach
函数没有 return 值。 (严格来说,函数 return 是print()
的值为 NULL。)
使用
f <- foreach(c = 1:P) %dopar% { c }
基础 R 中的 for()
和 foreach()
之间的重要区别在于,您在 for()
中所做的任何事情都可以在 for()
的父环境中使用。但是,foreach()
是一个函数,foreach()
函数内部的任何内容对于函数环境都是本地的。
在某种意义上,foreach()
比 for()
更类似于 lapply()
。