在 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 <- 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代码示例