2015-12-22 13 views
5

Tôi thực sự đang thua lỗ ở đây. Tôi tìm thấy một vài chủ đề ở đây trên ngăn xếp tràn vào làm thế nào để chuyển hướng đầu ra của một chức năng, nhưng không ai trong số đó có vẻ là làm việc trong trường hợp của tôi.Ghi lại kết quả đầu ra của chức năng thư viện

Tôi đang sử dụng arima từ library(forecast) cho nhiều thời gian (được tạo), và một số trong số chúng có đặc tính không tốt, dẫn đến lỗi auto.arima() in lỗi và cảnh báo. Tôi không thể bắt lỗi này dù sao, có thể là thông qua tryCatch hoặc capture.output() (chỉ ghi lại dự báo bình thường).

Mục đích là để nắm bắt thông báo lỗi (và cảnh báo) được đưa ra bởi ví dụ bên dưới và phản ứng với nó. Vì vậy, về cơ bản ở cuối tôi sẽ có lỗi và dự báo (mặc dù bị sai lầm) trong một số hình thức biến.

Tôi đánh giá cao bất cứ đề nghị, sau đây là ví dụ nhỏ để sản xuất các lỗi:

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

gì ... chính xác ... bạn đang cố gắng để nắm bắt? Tôi nhận được: 'Lỗi trong arima (x, trật tự = c (1, d, 0), xreg = xreg): phần AR không cố định từ CSS' –

+1

@ 42- OP đang cố gắng nắm bắt lỗi được ném bởi' tự động. arima'. Ví dụ là cố ý không làm việc, để ném một lỗi. –

+0

Tôi nghĩ rằng các mục tiêu của OP vẫn còn mơ hồ. Đầu ra (cho bàn điều khiển) từ cuộc gọi đó đến 'auto.arima' bao gồm cả thông báo lỗi và tóm tắt mô hình. Vì báo cáo lỗi không thực sự tạm dừng thực thi, cuộc gọi trả về một đối tượng với lớp 'c (" ARIMA "," arima ")'. Vì vậy, các mục tiêu của mã hóa cần phải được làm rõ. Có hai câu trả lời khác nhau đã giải thích các mục tiêu này một cách khác nhau. –

Trả lời

5

Bạn có thể nắm bắt được lỗi và cảnh báo với đối số type="message" để capture.output. type có thể là "đầu ra", ghi lại đầu ra chức năng hoặc "thông báo", ghi lại các lỗi và cảnh báo. Hàm bên dưới sử dụng sapply để cho phép bạn chạy capture.output một lần với mỗi đối số, lưu trữ kết quả trong danh sách.

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" 

Kể từ khi bắt đầu ra mô hình với capture.output lẽ là không hữu ích như chụp đầu ra "thực" trong đối tượng mô hình, có lẽ chức năng dưới đây sẽ tốt hơn. Nó trả về một danh sách với đối tượng mô hình và bất kỳ thông báo lỗi hoặc cảnh báo nào:

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

Đối tượng mô hình có sẵn theo cách thông thường, vì vậy tôi chỉ nhìn vào đầu ra của thông báo.

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

Cảm ơn bạn đã giải thích, chức năng chụp với danh sách chính xác là những gì tôi đang tìm kiếm! :) – wlfbck

4

Nếu tôi hiểu chính xác, bạn muốn chặn in thông báo lỗi. (Điều đó ít nhất dường như là mục tiêu của cuộc gọi của bạn tới tryCatch().) Một cách để thực hiện điều đó là ngay lập tức trước khi bạn gọi tới auto.arima(), chuyển hướng bất kỳ thông báo lỗi nào sang tệp tạm thời, sử dụng sink(..., type="message"). Sau đó, ngay sau cuộc gọi, dọn dẹp bằng cách dừng chìm vào tệp và sau đó xóa nó.

Dưới đây là một cách để bạn có thể thực hiện điều đó:

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

Tôi đã có ấn tượng rằng OP muốn nắm bắt các lỗi và cảnh báo. – eipi10

+0

@ eipi10 - Có thể.Tôi nghĩ câu hỏi này gần như hoàn toàn mơ hồ về việc liệu nó có đang tìm cách để trộn lẫn hoặc nắm bắt và kiểm tra các lỗi và cảnh báo. Đoán chúng ta sẽ tìm ra khi OP chimes in. –

+0

withCallingHandlers có thể giúp với https://stackoverflow.com/questions/19433848/handling-errors-before-warnings-in-trycatch/19446931#19446931 – Hansi

Các vấn đề liên quan