stopifnot {base}  R Documentation 
If any of the expressions (in ...
or exprs
) are not
all
TRUE
, stop
is called, producing
an error message indicating the first expression which was not
(all
) true.
stopifnot(..., exprs, exprObject, local = TRUE, allow.logical0 = getOption("stopifnot_allow.logical0", TRUE))
..., exprs 
any number of R expressions, which should each
evaluate to (a logical vector of all) { expr1 expr2 .... } Note that e.g., positive numbers are not If names are provided to 
exprObject 
alternative to 
local 
(only when 
allow.logical0 
logical indicating if expressions evaluating to

This function is intended for use in regression tests or also argument checking of functions, in particular to make them easier to read.
stopifnot(A, B)
or equivalently stopifnot(exprs= {A ;
B})
are conceptually equivalent to
{ if(any(is.na(A))  !all(A)) stop(...); if(any(is.na(B))  !all(B)) stop(...) }
Note however that in the case where A
evaluates to
logical(0)
, as all(logical(0))
is TRUE
, would
“allow” that too, and did so in all R versions up to 4.0.x.
This now only happens when allow.logical0 = TRUE
is set, because
R's recycling rule for 0length objects would entail that
stopifnot(dim(m) = c(100, 3))
would not indicate a problem, e.g.,
for m < 1:7
, as indeed all(dim(m) = c(100, 3))
is true.
Since R version 3.6.0, stopifnot()
no longer handles potential
errors or warnings (by tryCatch()
etc) for each single
expression
and may use sys.call(<n>)
to get a meaningful and short
error message in case an expression did not evaluate to all TRUE. This
provides considerably less overhead.
Since R version 3.5.0, expressions are evaluated sequentially, and hence evaluation stops as soon as there is a “nonTRUE”, as indicated by the above conceptual equivalence statement.
Also, since R version 3.5.0, stopifnot(exprs = { ... })
can be used
alternatively and may be preferable in the case of several
expressions, as they are more conveniently evaluated interactively
(“no extraneous ,
”).
Since R version 3.4.0, when an expression (from ...
) is not
true and is a call to all.equal
, the error
message will report the (first part of the) differences reported by
all.equal(*)
.
(NULL
if all statements in ...
are TRUE
.)
Trying to use the stopifnot(exprs = ..)
version via a shortcut,
say,
assertWRONG < function(exprs) stopifnot(exprs = exprs)
is delicate and the above is not a good idea. Contrary to stopifnot()
which takes care to evaluate the parts of exprs
one by one and
stop at the first nonTRUE, the above short cut would typically evaluate
all parts of exprs
and pass the result, i.e., typically of the
last entry of exprs
to stopifnot()
.
However, a more careful version,
assert < function(exprs) eval.parent(substitute(stopifnot(exprs = exprs)))
may be a nice short cut for stopifnot(exprs = *)
calls using the
more commonly known verb as function name.
stop
, warning
;
assertCondition
in package tools complements
stopifnot()
for testing warnings and errors.
stopifnot(1 == 1, all.equal(pi, 3.14159265), 1 < 2) # all TRUE m < matrix(c(1,3,3,1), 2, 2) stopifnot(m == t(m), diag(m) == rep(1, 2)) # all(.) => TRUE op < options(error = expression(NULL)) # "disabling stop(.)" << Use with CARE! >> stopifnot(length(10)) # gives an error: '1' is *not* TRUE ## even when if(1) "ok" works stopifnot(all.equal(pi, 3.141593), 2 < 2, (1:10 < 12), "a" < "b") ## More convenient for interactive "line by line" evaluation: stopifnot(exprs = { all.equal(pi, 3.1415927) 2 < 2 1:10 < 12 "a" < "b" }) eObj < expression(2 < 3, 3 <= 3:6, 1:10 < 2) stopifnot(exprObject = eObj) stopifnot(exprObject = quote(3 == 3)) stopifnot(exprObject = TRUE) # long all.equal() error messages are abbreviated: stopifnot(all.equal(rep(list(pi),4), list(3.1, 3.14, 3.141, 3.1415))) # The default error message can be overridden to be more informative: m[1,2] < 12 stopifnot("m must be symmetric"= m == t(m)) #=> Error: m must be symmetric options(op) # revert to previous error handler