R中出现“ warnings()”时中断循环


103

我遇到一个问题:我正在运行一个循环来处理多个文件。我的矩阵很大,因此如果我不小心,我经常会用光内存。

如果创建了任何警告,是否有办法打破循环?它只是继续运行循环,并在以后报告失败了……很烦人。任何想法哦,明智的stackoverflow-ers ?!

Answers:


150

您可以使用以下方法将警告变为错误:

options(warn=2)

与警告不同,错误会中断循环。很好,R还将向您报告这些特定的错误是从警告中转换而来的。

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
之后,使用options(warn=1) 来恢复默认设置。
Alex Holcombe

25
不过,默认值为0。因此,要恢复出厂设置使用options("warn"=0)
Dirk Eddelbuettel

在R中重置选项通常最好由1)op=options(warn=2),2)执行您的事情然后3)用重置来最好地处理,在这种情况下options(op),您可以返回warn=0
孟买

44

R允许您定义条件处理程序

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

导致

handling warning: oops
> x
[1] NA

在tryCatch之后执行继续;您可以通过将警告转换为错误来决定结束

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

或优雅地处理条件(警告呼叫后继续评估)

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

哪个打印

handled warning: oops
[1] 1

+1-很棒。我曾想过要提到此选项,但不可能编写出这么简短但精妙的教程。
乔什·奥布莱恩

有一个不错的示范for甚至会更好:)
JelenaČuklina

28

设置全局warn选项:

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

请注意,“警告”不是“错误”。循环不会因警告而终止(除非options(warn=2))。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.