>%dopar% 将主 R 进程分叉为几个独立的子进程。有没有办法使这些子进程与主R进程通信,以便可以"恢复"数据?
require(foreach)
require(doMC)
registerDoMC()
options(cores = 2 )
a <- c(0,0)
foreach(i = 1:2 ) %do% {
a[i] <- i
}
print(a) # returns 1 2
a <- c(0,0)
foreach(i = 1:2 ) %dopar% {
a[i] <- i
}
print(a) # returns 0 0
谢谢!
您应该阅读foreach文档:
foreach 和 %do%/%dopar% 运算符提供了一个循环构造 这可以被视为循环和Lapply标准的混合体 功能。它看起来类似于 for 循环,它计算一个 表达式,而不是函数(如 lapply),但它的目的是 返回一个值(默认情况下为列表),而不是导致 副作用。
Try this:
a <- foreach(i = 1:2 ) %dopar% {
i
}
print(unlist(a))
如果希望结果是数据帧,可以执行以下操作:
library(data.table)
result <- foreach(i = 1:2) %dopar% {
i
}
result.df <- rbindlist(Map(as.data.frame, result))
感谢 Karl,我现在明白了".combine"的目的
a <- foreach(i = 1:2 , .combine=c) %dopar% {
return(i)
}
print(a) # returns 1 2