2015-12-22 19 views
5

Ich bin hier wirklich ratlos. Ich habe ein paar Threads hier im Stack-Overflow gefunden, wie man die Ausgabe einer Funktion umleitet, aber nichts davon scheint in meinem Fall zu funktionieren.Catching Output einer Bibliotheksfunktion

Ich verwende Arima aus der library(forecast) für viele (generierte) Zeitreihen, und einige von ihnen haben schlechte Eigenschaften, die auto.arima() zum Ausdrucken eines Fehlers und einer Warnung ergibt. Ich kann diesen Fehler sowieso nicht abfangen, sei es über tryCatch oder capture.output() (die nur die normale Vorhersage erfasst).

Das Ziel ist es, die Fehlermeldung (und Warnung) zu erfassen, die durch das folgende Beispiel ausgelöst wird, und darauf zu reagieren. Also würde ich am Ende den Fehler und die Vorhersage (trotz Fehler) in einer variablen Form haben.

ich irgendwelche Vorschläge zu schätzen weiß, ist die folgende das minimale Beispiel der Fehler zu erzeugen:

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

Was ... genau ... versuchen Sie zu erfassen? Ich bekomme: 'Fehler in arima (x, Reihenfolge = c (1, d, 0), xreg = xreg): nicht-stationärer AR-Teil von CSS' –

+1

@ 42-OP versucht, den von' auto geworfenen Fehler zu erfassen. Arima. Das Beispiel funktioniert absichtlich nicht, um einen Fehler zu erzeugen. –

+0

Ich denke, die Ziele des OP bleiben zweideutig. Die Ausgabe (an die Konsole) von diesem Aufruf an "auto.arima" enthält sowohl eine Fehlermeldung als auch eine Modellzusammenfassung. Da der Fehlerbericht die Ausführung nicht stoppt, gibt der Aufruf ein Objekt mit der Klasse 'c (" ARIMA "," arima ")' zurück. Die Ziele der Codierung müssen also geklärt werden. Es gibt zwei verschiedene Antworten, die diese Ziele unterschiedlich interpretiert haben. –

Antwort

5

Sie können die Fehler und Warnungen mit dem zu capture.outputtype="message" Argumente erfassen. type kann entweder "output" sein, die die Funktionsausgabe erfasst, oder "message", die die Fehler und Warnungen erfasst. Die folgende Funktion verwendet , damit Sie capture.output einmal mit jedem Argument ausführen und die Ergebnisse in einer Liste speichern können.

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" 

Da die Modellausgabe mit capture.output Erfassung wahrscheinlich als die Erfassung der „echte“ Ausgabe in dem Modellobjekt nicht so nützlich ist, vielleicht die Funktion unten wäre besser. Es gibt eine Liste mit dem Modellobjekt und alle Fehler oder Warnmeldungen:

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

Das Modellobjekt in gewohnter Weise zur Verfügung steht, so unten ich an der Nachrichtenausgabe anschauen.

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

Danke für die Erklärungen, die Capture-Funktion mit der Liste war genau das, was ich gesucht habe! :) – wlfbck

4

Wenn ich richtig verstehe, möchten Sie das Drucken der Fehlermeldung unterdrücken. (Dies scheint zumindest das Ziel Ihres Anrufs an tryCatch() zu sein.) Eine Möglichkeit dazu besteht darin, unmittelbar vor Ihrem Anruf an auto.arima() alle Fehlermeldungen in eine temporäre Datei umzuleiten, indem Sie sink(..., type="message") verwenden. Dann, direkt nach dem Anruf, bereinigen Sie sich, indem Sie aufhören, in die Datei zu sinken und sie dann zu löschen.

Hier ist eine Art und Weise, dass implementieren könnte:

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

Ich hatte den Eindruck, dass das OP die Fehler und Warnungen erfassen wollte. – eipi10

+0

@ eipi10 - Könnte sein.Ich dachte, die Frage sei fast völlig zweideutig, ob sie nach Möglichkeiten suchte, die Fehler und Warnungen zu dämpfen oder zu erfassen und zu untersuchen. Ratet mal, wir werden herausfinden, wenn das OP klingelt. –

+0

withCallingHandlers könnte in der Lage sein, mit dieser https://stackoverflow.com/questions/19433848/handling-errors-beforewarnings-in-trycatch/19446931#19446931 – Hansi