忽略 tryCatch() 中的简单警告/错误 [英] Disregarding simple warnings/errors in tryCatch()

查看:46
本文介绍了忽略 tryCatch() 中的简单警告/错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 tryCatch() 的超级粉丝.然而,直到今天我才真正注意简单和常规警告/错误之间的区别,因此我真的不知道如何处理它们.

I'm a huge fan of tryCatch(). However, until today I never really paid attention to the distinction between simple and regular warnings/errors and thus I don't really know how to handle them.

我想知道的是如何告诉 tryCatch (查看帮助文件) 简单的警告是可以的,它应该返回 expr 的结果而不是跳转到 warning 部分.

What I'd like to know is how to tell tryCatch (see help file) that simple warnings are OK and that it should return the result of expr instead of jumping to the warning section.

您会在下面找到一个可重现的示例

Below you'll find a reproducible example

require("forecast")
y   <- ts(c(6178, 7084, 8162, 8462, 9644, 10466, 10748, 9963, 8194, 6848, 7027, 7269, 6775, 7819, 8371, 9069, 10248, 11030, 10882, 10333, 9109, 7685, 7602, 8350, 7829, 8829, 9948, 10638, 11253, 11424, 11391, 10665, 9396, 7775, 7933, 8186, 7444, 8484, 9864, 10252, 12282, 11637, 11577, 12417, 9637, 8094, 9280, 8334, 7899, 9994, 10078, 10801, 12950, 12222, 12246, 13281, 10366, 8730, 9614, 8639, 8772, 10894, 10455, 11179, 10588, 10794, 12770, 13812, 10857, 9290, 10925, 9491, 8919, 11607, 8852, 12537, 14759, 13667, 13731, 15110, 12185, 10645, 12161, 10840, 10436, 13589, 13402, 13103, 14933, 14147, 14057, 16234, 12389, 11595, 12772))
out <- forecast::auto.arima(x=y)
> out
Series: y 
ARIMA(4,1,1)                    

Coefficients:
         ar1      ar2     ar3      ar4      ma1
      0.6768  -0.2142  0.5025  -0.7125  -0.8277
s.e.  0.0749   0.0889  0.0874   0.0735   0.0485

sigma^2 estimated as 915556:  log likelihood=-780.33
AIC=1572.65   AICc=1573.62   BIC=1587.91

tryCatch >> 简单警告

当我用 tryCatch 包装它时,它检测到一个简单的警告,该警告将导致我的 expr 块被跳过"以支持 warning部分.因此该函数不返回估计结果,而是简单的警告.

tryCatch >> simple warning

When I wrap it with tryCatch, it detects a simple warning that will cause my expr block to be "skipped" in favor of the warning section. Thus the function does not return the estimation result, but the simple warning.

mod <- tryCatch(
    out <- forecast::auto.arima(x=y),
    error=function(e) {
        print(e)
    },
    warning=function(w) {
        print(w)
    }
)

> mod 
<simpleWarning in kpss.test(x): p-value smaller than printed p-value>

当前的解决方法

if (any(class(mod) == "simpleWarning")) {
    mod <- forecast::auto.arima(x=y)
}

> mod
Series: y 
ARIMA(4,1,1)                    

Coefficients:
         ar1      ar2     ar3      ar4      ma1
      0.6768  -0.2142  0.5025  -0.7125  -0.8277
s.e.  0.0749   0.0889  0.0874   0.0735   0.0485

sigma^2 estimated as 915556:  log likelihood=-780.33
AIC=1572.65   AICc=1573.62   BIC=1587.91

推荐答案

我认为您正在寻找 tryCatch 之间的区别,它捕获条件并继续从 tryCatch 所在的环境进行评估已定义,而 withCallingHandlers 允许您处理"条件,然后从条件发生的位置继续.看看 warning (或警告的帮助页面,但这不太有趣),尤其是行

I think you're looking for the difference between tryCatch, which catches a condition and continues evaluation from the environment where the tryCatch was defined, versus withCallingHandlers, which allows you to 'handle' a condition and then continue on from the location where the condition occurred. Take a look at warning (or the help page for warning, but that's less fun), especially the lines

    withRestarts({
        .Internal(.signalCondition(cond, message, call))
        .Internal(.dfltWarn(message, call))
    }, muffleWarning = function() NULL)

这表示 -- 发出条件信号,但在发出条件信号的位置插入重新启动".那么你会

This says -- signal a condtion, but insert a 'restart' where the condition was signaled from. Then you'd

withCallingHandlers({
    warning("curves ahead")
    2
}, warning = function(w) {
    ## what are you going to do with the warning?
    message("warning occurred: ", conditionMessage(w))
    invokeRestart("muffleWarning")
})

尽管 withCallingHandlers 经常与警告一起使用,而 tryCatch 经常与错误一起使用,但没有什么可以阻止人们处理"错误或捕获警告(如果这是合适的)行动.

Although withCallingHandlers is often used with warnings and tryCatch with errors, there is nothing to stop one from 'handling' an error or catching a warning if that is the appropriate action.

这篇关于忽略 tryCatch() 中的简单警告/错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆