该checkForRemoteErrors
函数由parLapply
and调用clusterApply
以检查任务错误,如果任何任务失败,它将抛出错误。不幸的是,尽管它显示了错误消息,但它没有提供任何关于是什么工作代码导致错误的信息。但是如果你修改你的worker/task函数来捕获错误,你可以保留一些额外的信息,这些信息可能有助于确定错误发生在哪里。
例如,这是一个失败的简单雪地程序。请注意,它outfile=''
在创建集群时使用,以便显示程序的输出,这本身就是一种非常有用的调试技术:
library(snow)
cl <- makeSOCKcluster(2, outfile='')
problem <- function(i) {
if (NA)
j <- 999
else
j <- i
2 * j
}
r <- parLapply(cl, 1:2, problem)
执行此操作时,您会看到来自的错误消息checkForRemoteErrors
和其他一些消息,但没有任何信息告诉您该if
语句导致了错误。为了在调用时捕获错误problem
,我们定义workerfun
:
workerfun <- function(i) {
tryCatch({
problem(i)
},
error=function(e) {
print(e)
stop(e)
})
}
现在我们workerfun
使用parLapply
而不是执行problem
,首先导出problem
到工人:
clusterExport(cl, c('problem'))
r <- parLapply(cl, 1:2, workerfun)
在其他消息中,我们现在看到
<simpleError in if (NA) j <- 999 else j <- i: missing value where TRUE/FALSE needed>
if
其中包括产生错误的实际语句。当然,它不会告诉你表达式的文件名和行号,但通常足以让你解决问题。