gpt4 book ai didi

r - 在 tryCatch 中的警告之前处理错误

转载 作者:行者123 更新时间:2023-12-03 20:57:59 28 4
gpt4 key购买 nike

我正在处理一个同时引发错误和警告的函数。
(相关:A Warning About Warning)

通常,警告会导致错误。在这些情况下,我想忽略警告并仅处理错误。

另一方面,如果只有警告(没有错误),那么我想捕获警告。

我正在尝试使用臭名昭著的易于使用的 tryCatch .

我的直接问题是:
有没有办法强制tryCatch处理error之前 warning s(或者在出现错误时忽略警告)?

我的理解来自?tryCatch文档是条件是FIFO处理的,在这种情况下,我的直接问题的答案是否定的——至少不是直接的。在这种情况下,是否可以处理警告,然后在仍然捕获错误的同时继续执行该功能?

我无法使用的解决方案:

  • suppressWarnings # 我仍然想捕获并处理警告
  • options(warn=2) # 某些警告是无害的

  •      relevant from `?tryCatch`

    If a condition is signaled while evaluating expr then established handlers are checked, starting with the most recently established ones, for one matching the class of the condition. When several handlers are supplied in a single tryCatch then the first one is considered more recent than the second. If a handler is found then control is transferred to the tryCatch call that established the handler, the handler found and all more recent handlers are disestablished, the handler is called with the condition as its argument, and the result returned by the handler is returned as the value of the tryCatch call.



    下面是一个玩具示例:
    F.errorAndWarning <- function() {
    warning("Warning before the error")
    cat("I have moved on.")
    stop("error")
    TRUE
    }
    F.error <- function() {stop("error"); TRUE}


    test <- function(F)
    tryCatch(expr= {F}()
    , error=function(e) cat("ERROR CAUGHT")
    , warning=function(w) cat("WARNING CAUGHT")
    )

    test(F.error)
    # ERROR CAUGHT
    test(F.errorAndWarning)
    # WARNING CAUGHT

    预期/理想输出:
    test(F.errorAndWarning)
    # ERROR CAUGHT

    最佳答案

    所有三个答案都非常广泛和出色的工作,但我认为很多人也在寻找一种简短、简单的方法来处理警告,但继续执行。正如 Matthew 所示,这可以很快完成:通过调用重新启动(并使用 withCallingHandlers):

    test <- function(FUN) withCallingHandlers(
    expr=FUN(),
    error=function(e) cat("ERROR CAUGHT\n"),
    warning=function(w) {cat('WARNING CAUGHT\n'); invokeRestart(findRestart('muffleWarning'))}
    )

    这仍然会打印警告(即使稍后生成错误),但会继续执行

    关于r - 在 tryCatch 中的警告之前处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19433848/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com