2017-08-19 141 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"將是另一個很好的解決方案。