Vòng lặp ngắt khi “cảnh báo ()” xuất hiện trong R


103

Tôi đang gặp sự cố: Tôi đang chạy một vòng lặp để xử lý nhiều tệp. Ma trận của tôi rất lớn và do đó tôi thường hết bộ nhớ nếu không cẩn thận.

Có cách nào để thoát ra khỏi vòng lặp nếu có bất kỳ cảnh báo nào được tạo ra không? Nó chỉ tiếp tục chạy vòng lặp và báo cáo rằng nó không thành công sau đó nhiều ... khó chịu. Bất kỳ ý tưởng nào oh stackoverflow-ers khôn ngoan ?!

Câu trả lời:


150

Bạn có thể biến cảnh báo thành lỗi với:

options(warn=2)

Không giống như cảnh báo, lỗi sẽ làm gián đoạn vòng lặp. Đặc biệt, R cũng sẽ báo cáo cho bạn rằng những lỗi cụ thể này được chuyển đổi từ các cảnh báo.

j <- function() {
    for (i in 1:3) {
        cat(i, "\n")
        as.numeric(c("1", "NA"))
}}

# warn = 0 (default) -- warnings as warnings!
j()
# 1 
# 2 
# 3 
# Warning messages:
# 1: NAs introduced by coercion 
# 2: NAs introduced by coercion 
# 3: NAs introduced by coercion 

# warn = 2 -- warnings as errors
options(warn=2)
j()
# 1 
# Error: (converted from warning) NAs introduced by coercion

23
Sau đó, sử dụng options(warn=1) để khôi phục cài đặt mặc định.
Alex Holcombe

25
Giá trị mặc định là 0. Vì vậy, để khôi phục cài đặt gốc sử dụng options("warn"=0).
Dirk Eddelbuettel

Đặt lại các tùy chọn trong R thường được xử lý tốt nhất bằng cách 1) op=options(warn=2), 2) thực hiện công việc của bạn, và sau đó 3) đặt lại với options(op), điều này sẽ đưa bạn trở lại warn=0trong trường hợp này.
mbiron

44

R cho phép bạn xác định một trình xử lý điều kiện

x <- tryCatch({
    warning("oops")
}, warning=function(w) {
    ## do something about the warning, maybe return 'NA'
    message("handling warning: ", conditionMessage(w))
    NA
})

kết quả là

handling warning: oops
> x
[1] NA

Việc thực thi tiếp tục sau tryCatch; bạn có thể quyết định kết thúc bằng cách chuyển đổi cảnh báo của mình thành lỗi

x <- tryCatch({
    warning("oops")
}, warning=function(w) {
    stop("converted from warning: ", conditionMessage(w))
})

hoặc xử lý tình trạng một cách khéo léo (tiếp tục đánh giá sau cuộc gọi cảnh báo)

withCallingHandlers({
    warning("oops")
    1
}, warning=function(w) {
    message("handled warning: ", conditionMessage(w))
    invokeRestart("muffleWarning")
})

cái nào in

handled warning: oops
[1] 1

+1 - Xuất sắc. Tôi đã nghĩ đến việc đề cập đến tùy chọn này, nhưng không thể tổng hợp một hướng dẫn ngắn nhưng ngọt ngào như vậy.
Josh O'Brien

có một cuộc biểu tình với một tốt đẹp forsẽ tốt hơn :)
JelenaČuklina

28

Đặt warntùy chọn chung:

options(warn=1)  # print warnings as they occur
options(warn=2)  # treat warnings as errors

Lưu ý rằng "cảnh báo" không phải là "lỗi". Các vòng lặp không kết thúc đối với các cảnh báo (trừ khi options(warn=2)).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.