2015-12-22 8 views
5

का आउटपुट आउटपुट मैं वास्तव में यहां एक नुकसान में हूं। मुझे फ़ंक्शन के आउटपुट को रीडायरेक्ट करने के तरीके पर स्टैक ओवरफ़्लो पर कुछ धागे मिलते हैं, लेकिन इनमें से कोई भी मेरे मामले में काम नहीं कर रहा है।लाइब्रेरी फ़ंक्शन

मैं बहुत से (जेनरेटेड) टाइम्सरीज़ के लिए library(forecast) से अरिमा का उपयोग कर रहा हूं, और उनमें से कुछ में खराब गुण हैं, जिसके परिणामस्वरूप 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

क्या ... वास्तव में ... आप पर कब्जा करने की कोशिश कर रहे हैं:

यहाँ एक तरह से आपको लगता है कि लागू कर सकता है? मुझे मिलता है: 'एरिमा में त्रुटि (एक्स, ऑर्डर = सी (1, डी, 0), xreg = xreg): सीएसएस' –

+1

@ 42-ओपी से गैर-स्थिर एआर भाग 'ओपी' ऑटो द्वारा फेंकने वाली त्रुटि को कैप्चर करने का प्रयास कर रहा है। arima'। एक त्रुटि फेंकने के लिए उदाहरण जानबूझकर काम नहीं कर रहा है। –

+0

मुझे लगता है कि ओपी के लक्ष्य संदिग्ध रहते हैं। उस कॉल से आउटपुट (कंसोल तक) 'auto.arima' में एक त्रुटि संदेश और एक मॉडल सारांश दोनों शामिल हैं। चूंकि त्रुटि रिपोर्ट वास्तव में निष्पादन को रोक नहीं देती है, इसलिए कॉल क्लास 'c (" ARIMA "," arima ") के साथ एक ऑब्जेक्ट देता है। तो कोडिंग के लक्ष्यों को स्पष्ट करने की जरूरत है। दो अलग-अलग उत्तर हैं जिन्होंने इन लक्ष्यों को अलग-अलग व्याख्या किया है। –

उत्तर

5

आप capture.output को त्रुटियों और type="message" तर्क के साथ चेतावनी पर कब्जा कर सकते हैं:

मैं किसी भी सुझाव की सराहना करते हैं, निम्नलिखित न्यूनतम उदाहरण त्रुटि उत्पादन होता है। type या तो "आउटपुट" हो सकता है, जो फ़ंक्शन आउटपुट, या "संदेश" को कैप्चर करता है, जो त्रुटियों और चेतावनियों को कैप्चर करता है। नीचे दिया गया कार्य 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 साथ मॉडल उत्पादन पर कब्जा शायद मॉडल वस्तु में "असली" उत्पादन पर कब्जा करने के रूप में के रूप में उपयोगी नहीं है, हो सकता है नीचे समारोह बेहतर होगा। यह मॉडल वस्तु और किसी भी त्रुटि या चेतावनी संदेश के साथ एक सूची प्रस्तुत करती है:

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

मैं इस धारणा के तहत था कि ओपी त्रुटियों और चेतावनियों को पकड़ना चाहता था। – eipi10

+0

@ eipi10 - हो सकता है।मैंने सोचा कि सवाल लगभग पूरी तरह अस्पष्ट था कि क्या यह त्रुटियों और चेतावनियों को मफल या कैप्चर करने और जांचने का तरीका ढूंढ रहा था। मान लीजिए कि जब ओपी चिमटा जाएगा तो –

+0

के साथ कॉलिंग हैंडलर इस https://stackoverflow.com/questions/19433848/handling-errors-before-warnings-in-trycatch/19446931#19446931 – Hansi

संबंधित मुद्दे