【发布时间】:2014-08-03 01:46:39
【问题描述】:
我正在使用 apply 函数为我的每一行数据执行一个函数。我发现如果某一行数据触发错误,我将无法返回结果。我想知道是否有办法让 apply 函数为那个有问题的行给出错误或 NA 但仍然为其他行运行。
【问题讨论】:
我正在使用 apply 函数为我的每一行数据执行一个函数。我发现如果某一行数据触发错误,我将无法返回结果。我想知道是否有办法让 apply 函数为那个有问题的行给出错误或 NA 但仍然为其他行运行。
【问题讨论】:
您需要将您应用的函数包装在 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
同样它不会停止应用。
【讨论】:
foo(a,b,c),那么tryfoo 是function(a,b,c),然后您将它们传递给您的foo 函数内部。