2016-01-20 34 views
1

Answer to question about error handling with lapply的索引總是返回NANULL當一個元件出現故障時,即錯誤與lapply處理 - 輸出失敗元素

myfun <- function(s) { 
    tryCatch(doSomething(s), error = function(e) { return(NULL) } 
} 

然而,這是不夠的,因爲一般可以doSomething(s)返回NULLNA本身。因此,理想情況下,我想要myfun這樣寫,以便lapply(mylist, myfun)後我可以以某種方式獲取失敗元素的所有索引。這個怎麼做?

回答

2

捕捉,並通過與identity()

res = lapply(list(1, "two", 3), function(i) tryCatch({ 
    sqrt(i) 
}, error=identity) 

檢查錯誤

vapply(res, is, logical(1), "error") 

返回錯誤條件交給它釋放的錯誤往往是更好的返回像NANULL一個「神奇」的值,除非下游分析與返回的價值無縫對接。

作爲更先進的解決方案中,創建一個更精細的條件或延長錯誤類

my_condition = function(err) 
    structure(list(message=conditionMessage(err), 
        original=err), class=c("my", "condition")) 

並返回

res <- lapply(list(1, "two", 3), function(i) { 
    tryCatch({ 
     sqrt(i) 
    }, error=my_condition) 
})