2013-06-28 72 views
5

这些是我在R中的并行计算的第一步。下面的代码导致以下错误。我无能为力,因为我写的内容中没有mclapply函数,至少我没有明确说明。并行foreach循环产生mclapply错误

错误:

Error in mclapply(argsList, FUN, mc.preschedule = preschedule, mc.set.seed = set.seed, : 
    (list) object cannot be coerced to type 'integer' 
Calls: %dopar% -> <Anonymous> -> mclapply 
Execution halted 

代码:

dist<-array(0, dim=c(320,500,25)) 

mc<-8 
cl<-makeCluster(mc) 
registerDoMC(cl) 
opts<-list(chunkSize=10) 

for(a in 1:25) { 
    dist[,,a]<-foreach(x=1:500, .combine='cbind', .options.mc=opts) %:% 
    foreach(y=1:320, .combine='c') %dopar% { 
     gcd.slc(crdsx[y,x], crdsy[y,x], lot[a,5], lot[a,4]) 
    } 
} 
stopCluster(cl) 

在不同的机器,它很好地与

registerDoParallel(cl) 

,而不是

registerDoMC(cl) 
+1

你可以添加sessionInfo()到OP吗? –

+1

当你用'registerDoMC'注册一个并行后端时,函数'doMC'被设置为当你调用函数'%dopar%'时执行。 'doMC'包含对'mclapply'的调用,所以这就是它的来源。 – BenBarnes

回答

9

由于registerDoMC需要整数参数而不是集群对象,而registerDoParallel需要整数或集群对象,因此会出现该错误。基本上,你需要决定使用哪个软件包,而不是混合它们。

如果您使用doMC,则永远不会创建群集对象。一个最小doMC例子如下:

library(doMC) 
registerDoMC(3) 
foreach(i=1:10) %dopar% sqrt(i) 

doParallel包是doMCdoSNOW包的混搭,所以你不需要使用集群对象。前面的例子转换为doParallel很简单:

library(doParallel) 
registerDoParallel(3) 
foreach(i=1:10) %dopar% sqrt(i) 

混乱的事情是,在Windows上,doParallel实际上将创建并使用在幕后群集对象,而在Linux和Mac OS X,它不使用群集对象,因为它使用mclapply就像在doMC包中一样。我认为这很方便,但可能会造成混淆。

+0

谢谢。在完成了各种软件包中的众多示例之后,我在半夜留下了registerDoMc(集群)。也许在第二个敏锐的想法之后的第二天早上从未问过这个问题......把整数作为参数并完全依靠doMC确实是我在寻找的东西,谢谢! – user2530062