Breaking loop when "warnings()" appear in R Breaking loop when "warnings()" appear in R r r

Breaking loop when "warnings()" appear in R


You can turn warnings into errors with:

options(warn=2)

Unlike warnings, errors will interrupt the loop. Nicely, R will also report to you that these particular errors were converted from warnings.

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 errorsoptions(warn=2)j()# 1 # Error: (converted from warning) NAs introduced by coercion


R allows you to define a condition handler

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

which results in

handling warning: oops> x[1] NA

Execution continues after tryCatch; you could decide to end by converting your warning to an error

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

or handle the condition gracefully (continuing evaluation after the warning call)

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

which prints

handled warning: oops[1] 1


Set the global warn option:

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

Note that a "warning" is not an "error". Loops don't terminate for warnings (unless options(warn=2)).