2013-06-28 90 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