| 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, local = TRUE)
..., exprs |
any number of (typically but not necessarily
{
expr1
expr2
....
}
|
local |
(only when |
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(...) }
Since R version 3.5.0, expressions are evaluated sequentially,
and hence evaluation stops as soon as there is a “non-TRUE”, as
indicated by the above conceptual equivalence statement.
Further, when such an expression signals an error or
warning, its conditionCall() no longer
contains the full stopifnot call, but just the erroneous
expression.
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,
assert <- function(exprs) stopifnot(exprs = exprs)
is not a good idea at all. Contrary to stopifnot()
which takes care to evaluate the parts of exprs one by one and
stop at the first non-TRUE, such an assert() typically would
evaluate all parts of exprs and pass the result, i.e., typically
of the last entry of exprs to stopifnot().
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(all.equal(pi, 3.141593), 2 < 2, all(1:10 < 12), "a" < "b")
## More convenient for interactive "line by line" evaluation:
stopifnot(exprs = {
all.equal(pi, 3.1415927)
2 < 2
all(1:10 < 12)
"a" < "b"
})
# long all.equal() error messages are abbreviated:
stopifnot(all.equal(rep(list(pi),4), list(3.1, 3.14, 3.141, 3.1415)))
options(op) # revert to previous error handler