忽略tryCatch()中的简单警告/错误

时间:2013-03-08 13:25:22

标签: r warnings try-catch

我是tryCatch()的忠实粉丝。然而,直到今天,我从未真正关注简单和常规警告/错误之间的区别,因此我真的不知道如何处理它们。

实际问题

我想知道的是如何告诉tryCatchsee help file)简单的警告是正常的,它应该返回expr的结果,而不是跳到{ {1}}部分。

您将在下面找到可重现的示例


warning>>没有警告

tryCatch

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 &gt;&gt;简单警告

当我使用tryCatch打包时,它会检测到一个简单的警告,该警告会导致tryCatch块被“跳过”而支持expr部分。因此,该函数不会返回估计结果,而是返回简单警告。

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>

2 个答案:

答案 0 :(得分:9)

我认为您正在寻找tryCatchwithCallingHandlers之间的区别,warning可以捕捉到条件,并继续从定义tryCatch的环境进行评估,而 withRestarts({ .Internal(.signalCondition(cond, message, call)) .Internal(.dfltWarn(message, call)) }, muffleWarning = function() NULL) 可以让您“处理”条件然后从条件发生的位置继续。看一下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

虽然{{1}}经常与警告和{{1}}一起使用但是没有任何内容可以阻止他们“处理”错误或在适当的操作时发出警告。

答案 1 :(得分:2)

您可以回忆forecast部分中的warning,如下所示:

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

这将打印警告,但预测结果现在存储在mod中。

<simpleWarning in kpss.test(x): p-value smaller than printed p-value>
> 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