10

私はの大ファンですtryCatch()。しかし、今日まで、単純な警告/エラーと通常の警告/エラーの違いに注意を払うことはなかったため、それらの処理方法がよくわかりません。

実際の質問

私が知りたいのは、単純な警告はOKであり、セクションにジャンプする代わりに結果を返す必要があることを伝える方法tryCatchヘルプファイルを参照)です。exprwarning

以下に再現可能な例を示します


いいえ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

tryCatch>>簡単な警告

でラップすると、セクションを優先してブロックが「スキップ」されるtryCatchという単純な警告が検出されます。したがって、この関数は推定結果を返しませんが、単純な警告を返します。exprwarning

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
4

2 に答える 2

13

tryCatch条件をキャッチしてtryCatchが定義された環境から評価を継続する、とwithCallingHandlers、条件を「処理」して条件が発生した場所から続行できる、の違いを探していると思います。特に行を見てwarningください(または警告のヘルプページですが、それはあまり面白くありません)

    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、それが適切なアクションである場合、エラーの「処理」や警告のキャッチを阻止することはできません。

于 2013-03-08T14:37:20.383 に答える
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
于 2013-03-08T14:35:21.910 に答える