blob: 95f459ad18e98bdcafe920290467f97f09e51ded [file] [log] [blame]
% File src/library/base/man/all.equal.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2022 R Core Team
% Distributed under GPL 2 or later
\name{all.equal}
\title{Test if Two Objects are (Nearly) Equal}
\alias{all.equal}
\alias{all.equal.default}
\alias{all.equal.numeric}
\alias{all.equal.character}
\alias{all.equal.environment}
\alias{all.equal.envRefClass}
\alias{all.equal.factor}
\alias{all.equal.formula}
\alias{all.equal.function}
\alias{all.equal.list}
\alias{all.equal.language}
\alias{all.equal.POSIXt}
\alias{all.equal.raw}
\alias{attr.all.equal}
\concept{numerical equality}
\concept{approximately equal}
\concept{equality testing}
\usage{
all.equal(target, current, \dots)
\method{all.equal}{numeric}(target, current,
tolerance = sqrt(.Machine$double.eps), scale = NULL,
countEQ = FALSE,
formatFUN = function(err, what) format(err),
\dots, check.attributes = TRUE)
\method{all.equal}{list}(target, current, \dots,
check.attributes = TRUE, use.names = TRUE)
\method{all.equal}{environment}(target, current, all.names = TRUE,
evaluate = TRUE, \dots)
\method{all.equal}{function}(target, current, check.environment=TRUE, \dots)
\method{all.equal}{POSIXt}(target, current, \dots, tolerance = 1e-3, scale,
check.tzone = TRUE)
attr.all.equal(target, current, \dots,
check.attributes = TRUE, check.names = TRUE)
}
\arguments{
\item{target}{\R object.}
\item{current}{other \R object, to be compared with \code{target}.}
\item{\dots}{further arguments for different methods, notably the
following two, for numerical comparison:}
\item{tolerance}{numeric \eqn{\ge} 0. Differences smaller than
\code{tolerance} are not reported. The default value is close to
\code{1.5e-8}.}
\item{scale}{\code{NULL} or numeric > 0, typically of length 1 or
\code{length(target)}. See \sQuote{Details}.}
\item{countEQ}{logical indicating if the \code{target == current}
cases should be counted when computing the mean (absolute or
relative) differences. The default, \code{FALSE} may seem
misleading in cases where \code{target} and \code{current} only
differ in a few places; see the extensive example.}
\item{formatFUN}{a \code{\link{function}} of two arguments,
\code{err}, the relative, absolute or scaled error, and
\code{what}, a character string indicating the \emph{kind} of error;
may be used, e.g., to format relative and absolute errors differently.}
\item{check.attributes}{logical indicating if the
\code{\link{attributes}} of \code{target} and \code{current}
(other than the names) should be compared.}
\item{use.names}{logical indicating if \code{\link{list}} comparison
should report differing components by name (if matching) instead of
integer index. Note that this comes after \code{\dots} and so must
be specified by its full name.}
\item{all.names}{logical passed to \code{\link{ls}} indicating if
\dQuote{hidden} objects should also be considered in the environments.}
\item{evaluate}{for the \code{environment} method: \code{\link{logical}} indicating if
\dQuote{promises should be forced}, i.e., typically formal function arguments
be evaluated for comparison. If false, only the \code{\link{names}} of
the objects in the two environments are checked for equality.}
\item{check.environment}{logical requiring that the
\code{\link{environment}()}s of functions should be compared, too.
You may need to set \code{check.environment=FALSE} in unexpected
cases, such as when comparing two \code{\link{nls}()} fits.}
\item{check.tzone}{logical indicating if the \code{"tzone"} attributes
of \code{target} and \code{current} should be compared.}
\item{check.names}{logical indicating if the \code{\link{names}(.)}
of \code{target} and \code{current} should be compared.}
}
\description{
\code{all.equal(x, y)} is a utility to compare \R objects \code{x}
and \code{y} testing \sQuote{near equality}. If they are different,
comparison is still made to some extent, and a report of the
differences is returned. Do not use \code{all.equal} directly in
\code{if} expressions---either use \code{isTRUE(all.equal(....))} or
\code{\link{identical}} if appropriate.
}
\details{
\code{all.equal} is a generic function, dispatching methods on the
\code{target} argument. To see the available methods, use
\code{\link{methods}("all.equal")}, but note that the default method
also does some dispatching, e.g.\sspace{}using the raw method for logical
targets.
Remember that arguments which follow \code{\dots} must be specified by
(unabbreviated) name. It is inadvisable to pass unnamed arguments in
\code{\dots} as these will match different arguments in different
methods.
Numerical comparisons for \code{scale = NULL} (the default) are
typically on a \emph{relative difference} scale unless the
\code{target} values are close to zero or infinite. Specifically,
the scale is computed as the mean absolute value of \code{target}.
If this scale is finite and exceeds \code{tolerance}, differences
are expressed relative to it; otherwise, absolute differences are used.
Note that this scale and all further steps are computed only for those
vector elements
where \code{target} is not \code{\link{NA}} and differs from \code{current}.
If \code{countEQ} is true, the equal and \code{NA} cases are
\emph{counted} in determining the \dQuote{sample} size.
If \code{scale} is numeric (and positive), absolute comparisons are
made after scaling (dividing) by \code{scale}. Note that if all of
scale is close to 1 (specifically, within 1e-7), the difference is still
reported as being on an absolute scale.
For complex \code{target}, the modulus (\code{\link{Mod}}) of the
difference is used: \code{all.equal.numeric} is called so arguments
\code{tolerance} and \code{scale} are available.
The \code{\link{list}} method compares components of
\code{target} and \code{current} recursively, passing all other
arguments, as long as both are \dQuote{list-like}, i.e., fulfill
either \code{\link{is.vector}} or \code{\link{is.list}}.
The \code{\link{environment}} method works via the \code{list} method,
and is also used for reference classes (unless a specific
\code{all.equal} method is defined).
The method for date-time objects uses \code{all.equal.numeric} to
compare times (in \code{"\link{POSIXct}"} representation) with a
default \code{tolerance} of 0.001 seconds, ignoring \code{scale}.
A time zone mismatch between \code{target} and \code{current} is
reported unless \code{check.tzone = FALSE}.
\code{attr.all.equal} is used for comparing
\code{\link{attributes}}, returning \code{NULL} or a
\code{character} vector.
}
\value{
Either \code{TRUE} (\code{NULL} for \code{attr.all.equal}) or a vector
of \code{\link{mode}} \code{"character"} describing the differences
between \code{target} and \code{current}.
}
\references{
Chambers, J. M. (1998)
\emph{Programming with Data. A Guide to the S Language}.
Springer (for \code{=}).
}
\seealso{\code{\link{identical}}, \code{\link{isTRUE}}, \code{\link{==}}, and
\code{\link{all}} for exact equality testing.
}
\examples{
all.equal(pi, 355/113)
# not precise enough (default tol) > relative error
d45 <- pi*(1/4 + 1:10) ; one <- rep(1, 10)
tan(d45) == one # mostly FALSE, as not exactly
stopifnot(all.equal(
tan(d45), one)) # TRUE, but not if we are picky:
all.equal(tan(d45), one, tolerance = 0) # to see difference
all.equal(tan(d45), one, tolerance = 0, scale = 1)# "absolute diff.."
all.equal(tan(d45), one, tolerance = 0, scale = 1+(-2:2)/1e9) # "absolute"
all.equal(tan(d45), one, tolerance = 0, scale = 1+(-2:2)/1e6) # "scaled"
## 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")))
## A situation where 'countEQ = TRUE' makes sense:
x1 <- x2 <- (1:100)/10; x2[2] <- 1.1*x1[2]
## 99 out of 100 pairs (x1[i], x2[i]) are equal:
plot(x1,x2, main = "all.equal.numeric() -- not counting equal parts")
all.equal(x1,x2) ## "Mean relative difference: 0.1"
mtext(paste("all.equal(x1,x2) :", all.equal(x1,x2)), line= -2)
##' extract the 'Mean relative difference' as number:
all.eqNum <- function(...) as.numeric(sub(".*:", '', all.equal(...)))
set.seed(17)
## When x2 is jittered, typically all pairs (x1[i],x2[i]) do differ:
summary(r <- replicate(100, all.eqNum(x1, x2*(1+rnorm(x1)*1e-7))))
mtext(paste("mean(all.equal(x1, x2*(1 + eps_k))) {100 x} Mean rel.diff.=",
signif(mean(r), 3)), line = -4, adj=0)
## With argument countEQ=TRUE, get "the same" (w/o need for jittering):
mtext(paste("all.equal(x1,x2, countEQ=TRUE) :",
signif(all.eqNum(x1,x2, countEQ=TRUE), 3)), line= -6, col=2)
## comparison of date-time objects
now <- Sys.time()
stopifnot(
all.equal(now, now + 1e-4) # TRUE (default tolerance = 0.001 seconds)
)
all.equal(now, now + 0.2)
all.equal(now, as.POSIXlt(now, "UTC"))
stopifnot(
all.equal(now, as.POSIXlt(now, "UTC"), check.tzone = FALSE) # TRUE
)
}
\keyword{programming}% is.*
\keyword{utilities}
\keyword{logic}
\keyword{arith}