我正在使用apply函数为我的每一行数据执行一个函数。我发现如果一行数据触发错误,我就不会得到结果。我想知道是否有办法让apply函数为该有问题的行提供错误或NA但仍然为其他行运行。
答案 0 :(得分: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
同样,它不会停止申请。