2017-08-19 102 views
3

我想在一个非常大的数据集上运行的东西。基本上,我想遍历文件夹中的所有文件,然后运行JSON上的函数就可以了。但是,我希望它跳过产生错误的文件。我建立了一个功能,使用tryCatch然而,只有当我使用函数lappy而不是parLapplyTryCatch与parLapply(并行包)在R

这是我为我的异常处理函数代码:

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) 
} 

,然后我打电话parLapply一个特征向量文件其中包含完整路径的JSON文件:

dat<- parLapply(cl,files,readJson) 

当它到达不正确结束的文件时会产生错误,并且不会通过跳过有问题的文件来创建列表'dat'。 readJson函数应该减轻的是什么。

当我使用普通的乐器时,它的工作原理非常好。它会生成错误,但它仍会通过跳过错误的文件来创建列表。

关于如何使用parLappy并行处理异常处理的任何想法,以便它跳过有问题的文件并生成列表?

回答

2

在您的error处理函数cond是一个错误条件。 message(cond)表示这种情况,该情况在工人身上发现并作为错误传递给主人。要么删除message的呼叫,要么将其替换为 message(conditionMessage(cond)) 等东西,但您不会在主服务器上看到任何内容,因此删除可能是最好的。

+0

这个窍门!非常感谢!!! – user2905393

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"将是另一个很好的解决方案。