我遇到了一个问题: 我正在运行一个循环以处理多个文件。我的矩阵非常庞大,因此如果不小心操作,我经常会耗尽内存。
如果产生任何警告,有没有一种方法可以跳出循环?它只会继续运行循环并在很久之后报告失败……令人恼火。有什么好的想法吗?
你可以使用以下方法将警告转换为错误:
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
for
循环来进行演示会更好 :) - JelenaČuklina设置全局的warn
选项:
options(warn=1) # print warnings as they occur
options(warn=2) # treat warnings as errors
请注意,“警告”不等同于“错误”。除非使用 options(warn=2)
,否则循环不会因为警告而终止。
options(warn=1)
恢复默认设置。 - Alex Holcombeoptions("warn"=0)
。 - Dirk Eddelbuettelop = options(warn = 2)
,2)执行您的操作,然后3)使用options(op)
进行重置,在这种情况下将返回到warn = 0
。 - mbiron