2014-06-12 14 views
1

我正在使用apply函數爲我的每行數據執行一個函數。我發現如果一行數據觸發錯誤,我不會得到結果。我想知道是否有辦法讓apply函數給出有問題的行給出錯誤或NA,但仍然爲其他行運行。當數據的一行有錯誤時,應用函數停止運行

+0

對於錯誤處理,請嘗試使用例如'tryCatch',看[這裏](http://stackoverflow.com/questions/22021775/i-dont-understand-how-to-catch-an-error/22021936#22021936)或[here](http:// stackoverflow.com/questions/12193779/how-to-write-trycatch-in-r) – gagolews

回答

2

您需要將您的應用函數包裝在tryCatch中,如果失敗,將返回NA。

停止,如果X小於零:

> foo = function(x){if(x<0)stop("Zerrored");sqrt(x)} 

試試吧

> apply(matrix(0:5),1,foo) 
[1] 0.000000 1.000000 1.414214 1.732051 2.000000 2.236068 

> apply(matrix(-2:5),1,foo) 
Error in FUN(newX[, i], ...) : Zerrored 

該死。裹在一個tryCatch

> tryfoo=function(x){tryCatch(foo(x),error=function(e){NA})} 
> apply(matrix(-2:5),1,tryfoo) 
[1]  NA  NA 0.000000 1.000000 1.414214 1.732051 2.000000 2.236068 

工程!

您可能要提高,如果函數錯誤警告:

> tryfoo=function(x){tryCatch(foo(x),error=function(e){warning("Zerrored");NA})} 
> apply(matrix(-2:5),1,tryfoo) 
[1]  NA  NA 0.000000 1.000000 1.414214 1.732051 2.000000 2.236068 
Warning messages: 
1: In value[[3L]](cond) : Zerrored 
2: In value[[3L]](cond) : Zerrored 

同樣也不會停止適用。

+0

我有超過一個參數傳遞給函數。您能否告訴我如何在tryCatch函數中傳遞多個參數。謝謝! –

+0

如果你的函數是'foo(a,b,c)',那麼'tryfoo'是一個'function(a,b,c)',然後你將它們傳遞給你的'foo'函數。 – Spacedman

相關問題