Test if Two Objects are (Nearly) Equal

all.equal(x, y) is a utility to compare R objects x and y testing ‘near equality’. If they are different, comparison is still made to some extent, and a report of the differences is returned. Do not use all.equal directly in if expressions---either use isTRUE(all.equal(....)) or identical if appropriate.

utilities, arith, programming, logic
all.equal(target, current, ...)
"all.equal"(target, current, tolerance = sqrt(.Machine$double.eps), scale = NULL, ..., check.attributes = TRUE)
"all.equal"(target, current, ..., check.attributes = TRUE, use.names = TRUE)
"all.equal"(target, current, all.names=TRUE, ...)
"all.equal"(target, current, ..., tolerance = 1e-3, scale)
attr.all.equal(target, current, ..., check.attributes = TRUE, check.names = TRUE)
R object.
other R object, to be compared with target.
Further arguments for different methods, notably the following two, for numerical comparison:
numeric $\ge$ 0. Differences smaller than tolerance are not reported. The default value is close to 1.5e-8.
numeric scalar > 0 (or NULL). See ‘Details’.
logical indicating if the attributes of target and current (other than the names) should be compared.
logical indicating if list comparison should report differing components by name (if matching) instead of integer index. Note that this comes after ... and so must be specified by its full name.
logical passed to ls indicating if “hidden” objects should also be considered in the environments.
logical indicating if the names(.) of target and current should be compared.

all.equal is a generic function, dispatching methods on the target argument. To see the available methods, use methods("all.equal"), but note that the default method also does some dispatching, e.g.\ifelse{latex}{\out{~}}{ } using the raw method for logical targets.

Remember that arguments which follow ... must be specified by (unabbreviated) name: some of them were before ... prior to R 3.1.0. It is inadvisable to pass unnamed arguments in ... as these will match different arguments in different methods.

Numerical comparisons for scale = NULL (the default) are typically on relative difference scale unless the target values are close to zero: First, the mean absolute difference of the two numerical vectors is computed. If this is smaller than tolerance or not finite, absolute differences are used, otherwise relative differences scaled by the mean absolute target value. (Note that these comparisons are computed only for those vector elements where target is not NA and differs from current.)

If scale is positive, absolute comparisons are made after scaling (dividing) by scale.

For complex target, the modulus (Mod) of the difference is used: all.equal.numeric is called so arguments tolerance and scale are available.

The list method compares components of target and current recursively, passing all other arguments, as long as both are “list-like”, i.e., fulfill either is.vector or is.list.

The environment method works via the list method, and is also used for reference classes (unless a specific all.equal method is defined).

The methods for the date-time classes by default allow a tolerance of tolerance = 0.001 seconds, and ignore scale.

attr.all.equal is used for comparing attributes, returning NULL or a character vector.


Either TRUE (NULL for attr.all.equal) or a vector of mode "character" describing the differences between target and current.


Chambers, J. M. (1998) Programming with Data. A Guide to the S Language. Springer (for =).

See Also

identical, isTRUE, ==, and all for exact equality testing.

  • all.equal
  • all.equal.default
  • all.equal.numeric
  • all.equal.character
  • all.equal.environment
  • all.equal.envRefClass
  • all.equal.factor
  • all.equal.formula
  • all.equal.list
  • all.equal.language
  • all.equal.POSIXt
  • all.equal.raw
  • attr.all.equal
library(base) all.equal(pi, 355/113) # not precise enough (default tol) > relative error d45 <- pi*(1/4 + 1:10) stopifnot( all.equal(tan(d45), rep(1, 10))) # TRUE, but all (tan(d45) == rep(1, 10)) # FALSE, since not exactly all.equal(tan(d45), rep(1, 10), tolerance = 0) # to see difference ## advanced: equality of environments ae <- all.equal(as.environment("package:stats"), asNamespace("stats")) stopifnot(is.character(ae), length(ae) > 10, ## were incorrectly "considered equal" in R <= 3.1.1 all.equal(asNamespace("stats"), asNamespace("stats")))
Documentation reproduced from package base, version 3.3.0, License: Part of R 3.3.0

Community examples at Feb 28, 2020 base v3.6.2

**Prompting user to enter numeric values separated by a single space:** ``` prompt <- "Enter the number(s) (Use single space to separate input(s)):" n1 <- as.numeric(strsplit(readline(prompt), " ")[[1]]) n2 <- as.numeric(strsplit(readline(prompt), " ")[[1]]) ``` **Checking whether all inputs in vector n1(target) and vector n2(current) are of type numeric and returning a boolean value:** ``` if(isTRUE(all.equal.numeric(n1,n2,check.attributes = TRUE))) { print("All elements are of type numeric") } else { print("Differences found:") print(all.equal.numeric(n1,n2,check.attributes = TRUE)) } ```