我必須在多個數據集上運行分析。我使用帶有doSNOW包的plyr(mdply)來使用多個內核。 有時分析代碼會失敗,引發錯誤並停止執行。我希望對其他數據集繼續進行分析。如何實現這一目標? 解決方案1:編碼以便捕獲所有不可行的錯誤。 解決方案2:故障安全plyr包裝器並行運行該函數,返回所有有效結果,並指出出錯的地方。如何使用plyr mdply並行執行故障安全
我實施了第二種解決方案(請參閱下面的答案)。棘手的部分是我想要一個函數調用來完成故障安全和返回數據幀功能。
我如何去構造函數: 實際的函數調用是用tryCatch
包裝的。它是在callfailsafe
函數中調用的,而函數又需要將單個函數名稱simple
和(...)
中的相應參數傳遞給整個過程。 也許我做得太複雜了...但它有效。
確保您的simple
函數不依賴於任何全局定義的函數或參數,因爲這些函數在使用.parallel = T和doSNOW時不會加載。
這是我的測試數據集:有100個任務。對於每個函數「簡單」將被調用。但有時候這個功能會失敗。我通常在自動加載許多rdata文件的任務上使用它,執行大量處理,保存一些輸出並最終返回一個data.frame對象。
library(plyr)
library(doSNOW)
N=100
multiargtab= data.frame(ID=1:N,A=round(runif(N,0,1)),B=round(runif(N,0,1)))
simple=function(ID,A,B){ # a function that will sometimes fail
if(B==0) rm(B)
data.frame(A=A,B=B,AB=A/B,ID=ID)
}
調用函數的簽名是:
res2=mdply.anyfun.parallel.failsafe(multiargtab,simple)
你也可以用'try'而不是'tryCatch';它要簡單得多,而且通常都是需要的。 –