Breaking loop when "warnings()" appear in R

我有个问题: 我正在运行一个循环来处理多个文件。我的矩阵是巨大的,因此,如果我不小心,我经常会耗尽内存。

如果创建了任何警告,是否有办法打破循环?它只是不停地运行循环,并报告说它失败了很久以后... 恼人。有什么好主意吗!

53727 次浏览

设置全局 warn选项:

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

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

您可以使用以下命令将警告转换为错误:

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

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