gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:53:37 25 4
gpt4 key购买 nike

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

实际问题

我想知道的是怎么告诉tryCatch ( see help file ) 简单的警告是可以的,它应该返回 expr 的结果而不是跳转到 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
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>

当前的解决方法
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 (或警告的帮助页面,但这不太有趣),尤其是行

    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 一起使用对于错误,如果这是适当的操作,则无法阻止“处理”错误或捕获警告。

关于r - 忽略 tryCatch() 中的简单警告/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15295004/

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