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