在 R 中,当出现“warnings()”时如何跳出循环

126

我遇到了一个问题: 我正在运行一个循环以处理多个文件。我的矩阵非常庞大,因此如果不小心操作,我经常会耗尽内存。

如果产生任何警告,有没有一种方法可以跳出循环?它只会继续运行循环并在很久之后报告失败……令人恼火。有什么好的想法吗?

3个回答

189

你可以使用以下方法将警告转换为错误:

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

34
接下来,使用 options(warn=1) 恢复默认设置。 - Alex Holcombe
28
默认值为0。所以要恢复出厂设置,请使用options("warn"=0) - Dirk Eddelbuettel
在R中重置选项通常最好通过以下步骤处理:1)op = options(warn = 2),2)执行您的操作,然后3)使用options(op)进行重置,在这种情况下将返回到warn = 0 - mbiron

49

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
+1 -- 很棒。我本来想提到这个选项,但是没有能够写出如此简短而精彩的教程。 - Josh O'Brien
用一个漂亮的 for 循环来进行演示会更好 :) - JelenaČuklina

37

设置全局的warn选项:

options(warn=1)  # print warnings as they occur
options(warn=2)  # treat warnings as errors
请注意,“警告”不等同于“错误”。除非使用 options(warn=2),否则循环不会因为警告而终止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接