2015-12-22 8 views
5

私は本当にここに迷っています。関数の出力をどのようにリダイレクトするかについて、スタックオーバーフローのスレッドがいくつか見つかりましたが、私の場合はそのどれも動作していないようです。ライブラリ関数の出力をキャッチ

多くの(生成された)季節には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)) 
+0

正確に...あなたが捕獲しようとしている何を...:

ここではそれを実装できる一つの方法ですか? 'arima(x、order = c(1、d、0)、xreg = xreg)のエラー:CSSの非固定AR部分' –

+1

@ 42- OPは 'autoによって投げられたエラーを捕まえようとしています。 「arima」。この例は意図的に動作していないため、エラーが発生しています。 –

+0

私は、OPの目標はあいまいだと思います。 'auto.arima'へのその呼び出しからの(コンソールへの)出力には、エラーメッセージとモデル要約の両方が含まれています。エラー報告は実際には実行を停止しないので、呼び出しは 'c(" ARIMA "、" arima ")クラスのオブジェクトを返します。したがって、コーディングの目標を明確にする必要があります。これらの目標を発散的に解釈した2つの異なる答えがあります。 –

答えて

5

あなたはcapture.outputtype="message"引数でエラーと警告をキャプチャすることができます。 typeは、関数出力をキャプチャする "output"か、エラーと警告をキャプチャする "message"のいずれかになります。以下の関数はsapplyを使用して、引数ごとにcapture.outputを1回実行し、結果をリストに格納します。 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 = 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) 
+0

説明をありがとう、リストのキャプチャ機能は、私が探していたものでした! :) – wlfbck

4

私が正しく理解している場合は、エラーメッセージの印刷を抑制したいと考えています。 (少なくともtryCatch()への呼び出しの目標のようです。)auto.arima()への呼び出しの直前に、sink(..., type="message")を使用して、エラーメッセージを一時ファイルに転送する方法があります。その後、コール直後に、ファイルへの沈み込みを停止してから、それを削除してクリーンアップします。

muffleMessages <- function(expr) { 
    f <- tempfile() 
    ff <- file(f, open="w") 
    sink(ff, type="message") 
    on.exit({sink(); unlink(f)}) 
    expr 
} 

muffleMessages(auto.arima(testseries)) 
# Series: testseries 
# ARIMA(0,0,0) with non-zero mean 
# 
# Coefficients: 
#  intercept 
#  834.6000 
# s.e. 42.4746 
# 
# sigma^2 estimated as 9020: log likelihood=-29.86 
# AIC=63.73 AICc=69.73 BIC=62.94 
+0

私はOPがエラーと警告をキャプチャしたかったという印象を受けました。 – eipi10

+0

@ eipi10 - 可能性があります。エラーや警告を調べたり調べたりする方法を模索しているかどうかについては、ほとんど完全にあいまいであると思いました。 OPがでチャイムときに我々は見つけるでしょうね。 –

+0

withCallingHandlersは申し訳ありませんが、このhttps://stackoverflow.com/questions/19433848/handling-errors-before-warnings-in-trycatch/19446931#19446931 – Hansi