【问题标题】:apply function stops running when there is an error for one row of the data当一行数据出错时,apply函数停止运行
【发布时间】:2014-08-03 01:46:39
【问题描述】:

我正在使用 apply 函数为我的每一行数据执行一个函数。我发现如果某一行数据触发错误,我将无法返回结果。我想知道是否有办法让 apply 函数为那个有问题的行给出错误或 NA 但仍然为其他行运行。

【问题讨论】:

  • 对于错误处理,尝试使用例如tryCatch,见herehere

标签: r apply


【解决方案1】:

您需要将您应用的函数包装在 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

同样它不会停止应用。

【讨论】:

  • 我有多个参数要传递给函数。请告诉我如何在 tryCatch 函数中传递多个参数。谢谢!
  • 如果您的函数是foo(a,b,c),那么tryfoofunction(a,b,c),然后您将它们传递给您的foo 函数内部。
猜你喜欢
  • 2020-02-28
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多