【问题标题】:How to correctly log warnings and errors using `tryCatch` in R?如何在 R 中使用“tryCatch”正确记录警告和错误?
【发布时间】:2019-12-31 08:34:20
【问题描述】:

我有一个函数fun,它经常产生警告并偶尔抛出错误。我正在尝试使用tryCatch 来记录警告和错误,正如this answer 中所建议的那样。如何同时存储警告和错误?

这是一个最小设置:

# Function for warnings, errors.
fun <- function(i) {
    # Print warnings as they come in.
    options(warn = 1)

    # Issue warning.
    warning(paste("Warn.", i))

    # Stop.
    if(i == 3) { stop(paste("Err.", i)) }

    # Restore warning default behaviour.
    options(warn = 0)
}

tryCatch评估fun

# Storage
warns = list()
errs = list()

# Try catch the function and log the warnings/ errors.
for (i in 1:4) {
    tryCatch(fun(i),
        warning = function(w) warns[[i]] <<- w,
        error = function(e) errs[[i]] <<- e
    )
}

但是,输出显示错误尚未存储。

warns
# [[1]]
# <simpleWarning in fun(i): Warn. 1>
# 
# [[2]]
# <simpleWarning in fun(i): Warn. 2>
# 
# [[3]]
# <simpleWarning in fun(i): Warn. 3>
# 
# [[4]]
# <simpleWarning in fun(i): Warn. 4>


errs
# list()

【问题讨论】:

  • 我认为purrr::quietly 正是您想要的。 purrr.tidyverse.org/reference/safely.html 因为它明确输出错误和警告作为输出。
  • @AmitKohli,谢谢,了解quietly 很有用,但我很好奇R 的基本解决方案!
  • @RonakShah,谢谢,我现在正在看。如果有帮助,会通知您!
  • 它有帮助,谢谢你提到这个问题!

标签: r try-catch


【解决方案1】:

根据Ronak的有用的评论和下面的问题How do I save warnings and errors as output from a function?,代码可以简化如下:

# Storage.
warns = list()
errs = list()


# Example function.
fun <- function(i) {
    # Issue warning.
    warning(paste("Warn.", i))

    # Stop.
    if(i == 3) { stop(paste("Err.", i)) }
}


# Evaluate `fun`.
for (i in 1:4) {
    tryCatch(withCallingHandlers(
        expr = fun(i), 

        # Handle the warnings.
        warning = function(w) {
            warns <<- c(warns, list(w))
            invokeRestart("muffleWarning")
        }), 

        # Handle the errors.
        error = function(e) {
            errs <<- c(errs, list(e))
        }
    )
}

然后输出如下所示:

warns

# [[1]]
# <simpleWarning in fun(i): Warn. 1>
# 
# [[2]]
# <simpleWarning in fun(i): Warn. 2>
# 
# [[3]]
# <simpleWarning in fun(i): Warn. 3>
# 
# [[4]]
# <simpleWarning in fun(i): Warn. 4>


errs

# [[1]]
# <simpleError in fun(i): Err. 3>

更多信息和链接在上面链接的question 中提供。

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 2021-10-25
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2011-04-01
    相关资源
    最近更新 更多