我正在尝试在非常大的数据集上运行某些东西。基本上,我想遍历文件夹中的所有文件并在其上运行 fromJSON 。但是,我希望它跳过产生错误的文件。我已经使用 tryCatch 构建了一个函数,但是只有当我使用函数 lappy 而不是 parLapply 时才能使用。
这是我的异常处理函数的代码:
readJson <- function (file) {
require(jsonlite)
dat <- tryCatch(
{
fromJSON(file, flatten=TRUE)
},
error = function(cond) {
message(cond)
return(NA)
},
warning = function(cond) {
message(cond)
return(NULL)
}
)
return(dat)
}
然后我在字符向量 files 上调用parLapply,其中包含JSON文件的完整路径:
dat<- parLapply(cl,files,readJson)
当它到达的文件没有正确结束并且没有创建列表时会产生错误&#39; dat&#39;通过跳过有问题的文件。这是readJson函数应该缓解的内容。
当我使用普通的lapply时,它的效果非常好。它会生成错误,但是,它仍然会跳过错误的文件来创建列表。
关于如何使用parLappy并行处理异常处理的任何想法,以便它会跳过有问题的文件并生成列表?
答案 0 :(得分:3)
在error
处理程序中,函数cond
是一个错误条件。 message(cond)
表示这种情况,它被工作人员捕获并作为错误传送给主人。删除message
电话或将其替换为类似的电话
message(conditionMessage(cond))
但是你不会在主人身上看到任何东西,所以删除可能是最好的。
答案 1 :(得分:0)
你能做的就是这样(另一个例子,可重现):
test1 <- function(i) {
dat <- NA
try({
if (runif(1) < 0.8) {
dat <- rnorm(i)
} else {
stop("Error!")
}
})
return(dat)
}
cl <- parallel::makeCluster(3)
dat <- parallel::parLapply(cl, 1:100, test1)
有关其他解决方案,请参阅此related question。我认为将foreach
与.errorhandling = "pass"
一起使用将是另一个很好的解决方案。