为什么使用%dopar%的foreach循环不会产生所有结果

时间:2014-02-26 10:13:37

标签: r foreach parallel-processing domc

我正在运行下面的代码,只得到i = 1的结果 如何获得全部结果的行矩阵 - i = 2且i = 3?

library(doMC)
library(foreach)

number_of_cpus=4
cl<-makeCluster(number_of_cpus) 
registerDoMC(cores=4)


split_results2 <-

  foreach(i=1:3, .combine=rbind,  .inorder=TRUE, mc.cores=4) %dopar%  {

  Split_factor=as.character(split_factors[1,i])

  Data$Split_Factor = as.character(Data$Split_Factor)
  Data_new=Data[Data$Split_Factor==Split_factor,]


  GetSplit(Data_new,Data_ind,num_vars,num_factors,r_jobs,probs)  } 

1 个答案:

答案 0 :(得分:0)

foreach函数没有名为“mc.cores”的参数,因此它被视为迭代变量,但由于您只为其指定了一个值,因此它将循环限制为一次迭代。只需删除“mc.cores”参数,它应该按照您期望的方式工作。

考虑这个循环:

foreach(i=1:3, j=10) %dopar% {
  c(i, j)
}

它被“j”限制,返回一个包含一个元素的列表,而这个循环:

foreach(i=1:3, j=10:100) %dopar% {
  c(i, j)
}

受“i”限制,返回包含三个元素的列表。

Foreach并行迭代所有指定的迭代变量,因此循环受具有最少数量值的迭代变量的限制。请注意,在这方面,foreach的工作方式与“mapply”不同,后者使用较少的值来回收迭代变量。

另请注意,没有理由创建群集“cl”。它只会在你的机器上创建一些不会做任何事情的额外进程。