gpt4 book ai didi

r - 在 R 中使用 tryCatch 抑制警告

转载 作者:行者123 更新时间:2023-12-04 09:13:26 26 4
gpt4 key购买 nike

我想做什么

写个 tryCatch这将处理错误值但会忽略警告。举个例子

foo <- function(x) {
if (x == 1) {
warning('Warning')
} else if (x == 0) {
stop('Error')
}
return(1)
}

bar <- function(x){
tryCatch(
expr = foo(x),
error = identity,
warning = function(w) invokeRestart("muffleWarning")
)
}

所以 foo如果传递 0 会警告您,如果传递 1 则会出错。 bar 的意图是如果你传递一个 0,你会得到一个错误,但它会抑制 bar 产生的警告如果你通过了 1。 invokeRestart("muffleWarning")命令来自 suppressWarnings 的定义.它在我这里的建筑中不起作用,我不知道为什么。 (具有讽刺意味的是,它会生成一个错误,因此尝试成功将我不想要的警告升级为我无法解释的错误。)

我不想使用的愚蠢答案 (TM) 以及为什么
bar的这个定义将工作
bar <- function(x){
tryCatch(
expr = foo(x),
error = SomeFunctionThatDoesNotMatter,
warning = function(w){suppressWarnings(foo(x))}
)
}
bar完全按照我的意愿去做,但它以一种潜在的可怕方式做到了。想象一下,而不是 expr = foo(x)就像我在这里一样,我有 expr = lapply(X=1:50, ...)FUN需要一个小时才能运行。如 X[50]生成唯一的警告,然后我的运行时间从 50 小时增加到 100 小时(糟糕)。

问题
  • 为什么invokeRestart("muffleWarning")在我上面的例子中不起作用?
  • 使用时 tryCatch ,应该给warning分配什么功能为了让代码继续运行并抑制生成的警告?

  • 谢谢阅读!

    最佳答案

    在遵循 nrussell 的直觉之后,我遇到了这个问题。解决方案是替换泛型

    tryCatch({
    some_fn()
    }, warning = function(w) {
    print(paste('warning:', w))
    }, error = function(e) {
    print(paste('error:', e))
    })


    tryCatch({
    some_fn()
    }, error = function(e) {
    print(paste('error:', e))
    })

    这种格式/语法对我有用。您可以轻松地将其包含在您需要的功能中

    关于r - 在 R 中使用 tryCatch 抑制警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35785142/

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