捕获库函数的输出

时间:2015-12-22 03:59:03

标签: r

我真的很茫然。我在堆栈溢出时发现了一些关于如何重定向函数输出的线程,但是在我的情况下它似乎都没有。

我正在使用来自library(forecast)的arima来处理很多(生成的)时间序列,其中一些具有不良属性,导致auto.arima()打印出错误和警告。无论如何,我都无法捕捉此错误,无论是通过tryCatch还是capture.output()(仅捕获正常预测)。

目标是捕获下面示例抛出的错误消息(和警告)并对其作出反应。所以基本上最后我会以某种变量形式出现错误和预测(尽管有错误)。

我感谢任何建议,以下是产生错误的最小例子:

library(forecast)
testt <- c(826,816,839,995,697)
testend <- c(2015,164)
testseries <- ts(testt,end=testend,frequency=365)
auto.arima(testseries)
#tryCatch not working:
testfc <- tryCatch(forecast(auto.arima(testseries),h=1), error=function(e) NA)
#capture.output not working:
result <- capture.output(auto.arima(testseries))

2 个答案:

答案 0 :(得分:5)

您可以使用type="message"参数捕获错误和警告capture.outputtype可以是&#34;输出&#34;,它可以捕获函数输出,也可以是&#34; message&#34;,它可以捕获错误和警告。下面的函数使用sapply允许您使用每个参数运行capture.output一次,将结果存储在列表中。

capture.errors = function(type, data) {
  sapply(type, function(type) {
    capture.output(auto.arima(data), type=type)
  }, simplify=FALSE)
}

out = capture.errors(c("output","message"), testseries)

out

$output
[1] "Series: data "                                    
[2] "ARIMA(0,0,0) with non-zero mean "                 
[3] ""                                                 
[4] "Coefficients:"                                    
[5] "      intercept"                                  
[6] "       834.6000"                                  
[7] "s.e.    42.4746"                                  
[8] ""                                                 
[9] "sigma^2 estimated as 9020:  log likelihood=-29.86"
[10] "AIC=63.73   AICc=69.73   BIC=62.94"               

$message
[1] "Error in arima(x, order = c(1, d, 0), xreg = xreg) : "
[2] "  non-stationary AR part from CSS"                    
[3] "In addition: Warning message:"                        
[4] "In auto.arima(data) : Unable to calculate AIC offset" 

由于使用capture.output捕获模型输出可能并不像捕获&#34;真实&#34;在模型对象中输出,也许下面的函数会更好。它返回一个包含模型对象的列表以及任何错误或警告消息:

capture = function(data) {
list(model=auto.arima(data),
     message=capture.output(auto.arima(data), type="message"))
}

模型对象以通常的方式提供,所以下面我只看一下消息输出。

out1 = capture(testseries)

# Show any errors and warnings
out1[["message"]]
[1] "Error in arima(x, order = c(1, d, 0), xreg = xreg) : "
[2] "  non-stationary AR part from CSS"                    
[3] "In addition: Warning message:"                        
[4] "In auto.arima(data) : Unable to calculate AIC offset" 

out2 = capture(cumsum(rnorm(100)))

# No errors or warnings with this data set
out2[["message"]]
character(0)

答案 1 :(得分:4)

如果我理解正确,您希望禁止打印错误消息。 (这至少是您调用tryCatch()的目标。)一种方法是,在您调用auto.arima()之前,立即将任何错误消息转移到临时文件,使用{ {1}}。然后,在通话结束后,通过停止下沉到文件然后删除它来清理。

这是你可以实现的一种方式:

sink(..., type="message")