在 R 中编写更简单的 tryCatch 版本

Posted

技术标签:

【中文标题】在 R 中编写更简单的 tryCatch 版本【英文标题】:Writing a Simpler Version of tryCatch in R 【发布时间】:2018-12-23 08:00:45 【问题描述】:

在 R 中有一个名为tryCatch() 的函数可以从错误中恢复。我只见过写成函数的错误处理步骤。例如,添加error=function(e)0 将在出错时返回零值。有没有更简单的方法来定义tryCatch() 而不必将错误写为函数?如果不是,那为什么?

我更喜欢这样的语法和结果:

x <- tryCatch(sqrt("a"), 0)
#> x
#> [1] 0

您可以编写自己的 tryCatch() 包装函数(下面的示例),但我想知道现有包中是否已经有另一个函数或者我在 tryCatch() 文档中缺少的东西使这成为可能。

解决方案写成包装函数

iferror <- function(expr, error_expr)
  tryCatch(expr, error=function(e)error_expr)

x <- iferror(sqrt("a"), 0)
#> x
#> [1] 0

注意:这不是如何使用tryCatch()的问题,而是如何使其语法不那么冗长的问题。

【问题讨论】:

tryCatch 也会捕获警告。如果您想要一个特殊情况,您是否希望忽略该功能?这个怎么样:f0 &lt;- function(e) 0,然后是tryCatch(expr, error=f0)。这并没有节省多少,但至少您对tryCatch 的调用不那么混乱了。 我知道tryCatch() 处理警告和finally 表达式,但在这里并不关心。在您的示例中,错误仍被定义为函数。这似乎不必要地冗长,但也许这正是您必须使用tryCatch() 的方式 好的,purrr::possibly(sqrt,0)('a') 怎么样。由于possibly返回一个包装函数,你需要调用它,然后使用return再次调用,所以有点晦涩,我承认。 【参考方案1】:

一种可能的解决方案是使用 testit 包中的has_error() 函数。虽然 CRAN 版本不允许控制错误消息的抑制。

示例

ifelse(testit::has_error(sqrt("a")), 0)
#> Error in sqrt("a") : non-numeric argument to mathematical function
#> [1] 0

【讨论】:

以上是关于在 R 中编写更简单的 tryCatch 版本的主要内容,如果未能解决你的问题,请参考以下文章

R:使用 tryCatch() 在循环中跳过请求失败 [500] 错误失败

R语言使用tryCatch函数调试R代码实战:tryCatch函数运行正常R代码tryCatch函数运行有错误(error)的R代码示例/tryCatch函数运行有警告(warning)的R代码示例

在dplyr的mutate里面尝试tryCatch?

R tryCatch 处理一种错误

try 或 tryCatch 与引导 R

R语言tryCatch使用方法:判断Warning和Error