4

%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

谢谢!

4

3 回答 3

4

您应该阅读 foreach 文档:

foreach 和 %do%/%dopar% 运算符提供了一个循环结构,可以看作是标准 for 循环和 lapply 函数的混合体。它看起来类似于 for 循环,它计算一个表达式,而不是一个函数(如 lapply),但它的目的是返回一个值(默认情况下是一个列表),而不是产生副作用。

Try this:
a <- foreach(i = 1:2 ) %dopar% {
  i
}
print(unlist(a))
于 2013-09-13T10:01:55.947 回答
1

如果你希望你的结果是一个数据框,你可以这样做:

 library(data.table)
 result <- foreach(i = 1:2) %dopar% {
      i
 }
 result.df <- rbindlist(Map(as.data.frame, result))
于 2013-09-13T13:55:25.683 回答
0

感谢 Karl,我现在明白了 '.combine' 的目的

a <- foreach(i = 1:2 , .combine=c) %dopar% {
    return(i)
}
print(a) # returns 1 2
于 2013-09-13T10:12:48.507 回答