2013-12-20 59 views
24

中的錯誤我想第一次在我的機構中使用高性能羣集,一個我無法解決的問題。在R doParallel'foreach'中找不到函數 - {:任務1失敗 - 「找不到函數」光柵「」

下面的代碼返回一個錯誤:

ptime<-system.time({ 
    r <- foreach(z = 1:length(files),.combine=cbind) %dopar% { 
    raster <- raster(paste(folder,files[1],sep="")) 
    data<-getValues(raster) 
    clp <- na.omit(data) 
    for(i in 1:length(classes)){ 
     results[i,z]<-length(clp[clp==classes[i]])/length(clp) 
     print(z) 
    } 
    } 
}) 

Error in { : task 1 failed - "could not find function "raster"" 

A也嘗試了不同的foreach代碼執行另一項任務,我有:

r <- foreach (i=1:length(poly)) %dopar% { 
    clip<-gIntersection(paths,poly[i,]) 
    lgth<-gLength(clip) 
    vid<[email protected][i,3] 
    path.lgth[i,] <- c(vid,lgth) 
    print(i) 
} 

這個時候gIntersection功能是找不到的。很顯然,這些軟件包都已安裝並加載。看過一些論壇帖子後,它似乎與功能執行/運行的環境有關。

有人可以幫忙嗎?我不是程序員!

謝謝!

更新:

我已經調整了我的代碼所提供的解決方案:

results<-matrix(nrow=length(classes),ncol=length(files)) 
dimnames(results)[[1]]<-classes 
dimnames(results)[[2]]<-files 

ptime<-system.time({ 
    foreach(z = 1:length(files),.packages="raster") %dopar% { 
    raster <- raster(paste(folder,files[z],sep="")) 
    data<-getValues(raster) 
    clp <- na.omit(data) 
    for(i in 1:length(classes)){ 
     results[i,z]<-length(clp[clp==classes[i]])/length(clp) 
     print(z) 
    } 
    } 
}) 

但我得到的是充滿了NA的輸出(我的結果矩陣)。正如你所看到的,我創建了一個稱爲結果的矩陣對象來填充結果(它適用於for循環),但是在閱讀foreach的文檔之後,似乎用這個函數保存了不同的結果。

有關我應該爲.combine參數選擇什麼的建議?

+7

嘗試使用'foreach'的'.packages'參數。這些軟件包沒有加載到工作人員身上。 – Roland

+1

http://cran.r-project.org/web/packages/foreach/vignettes/foreach.pdf第8頁和第9頁。或'?foreach'。這就是羅蘭評論中給出的信息可以找到的地方。 –

+0

非常感謝您的幫助!這個問題已經解決,但現在我有一個新問題。我將編輯我的原始問題。 – Karen

回答

46

vignette of foreach和foreach的幫助頁面中,必要時指出參數.packages用於提供何時使用並行計算和未默認加載的函數。所以,你的第一個例子的代碼應該是:

ptime<-system.time({ 
    r <- foreach(z = 1:length(files), 
       .combine=cbind, 
       .packages='raster') %dopar% { 
     # some code 
     # and more code 
    } 
}) 

一些更多的解釋

foreach包做了很多建立在幕後的。什麼情況是以下(原則上,技術細節稍微更復雜):

  • foreach樹立「工人」,你可以看到每一個都致力於爲不同的核心作爲單獨的R會話的系統在一個集羣中。

  • 需要被執行被加載到每個「工人」會話,以進行功能

  • 每個工人所需的對象組合在一起的函數計算結果的數據的子集

  • 將不同工人的計算結果放在一起並在「主」R會話中報告。

由於工作人員可以看作是單獨的R會話,所以「主」會話中的包不會自動加載。您必須指定應在哪些工作程序會話中加載哪些程序包,這就是foreach的參數.package的用途。


注意,當你使用其他包(例如parallelsnowfall),你必須明確地設置了這些工人,並採取傳遞對象和裝載包的工人會話的照顧。

+3

還必須加載所有依賴關係。 –