Rev 81574 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
% 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 thefollowing 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 orrelative) differences. The default, \code{FALSE} may seemmisleading in cases where \code{target} and \code{current} onlydiffer 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}} comparisonshould report differing components by name (if matching) instead ofinteger index. Note that this comes after \code{\dots} and so mustbe 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 argumentsbe evaluated for comparison. If false, only the \code{\link{names}} ofthe 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 unexpectedcases, such as when comparing two \code{\link{nls}()} fits.}\item{check.tzone}{logical indicating if the \code{"tzone"} attributesof \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 thedifferences 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 methodalso does some dispatching, e.g.\sspace{}using the raw method for logicaltargets.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 differentmethods.Numerical comparisons for \code{scale = NULL} (the default) aretypically 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}, differencesare expressed relative to it; otherwise, absolute differences are used.Note that this scale and all further steps are computed only for thosevector elementswhere \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 aremade after scaling (dividing) by \code{scale}. Note that if all ofscale is close to 1 (specifically, within 1e-7), the difference is stillreported as being on an absolute scale.For complex \code{target}, the modulus (\code{\link{Mod}}) of thedifference 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 otherarguments, as long as both are \dQuote{list-like}, i.e., fulfilleither \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} tocompare times (in \code{"\link{POSIXct}"} representation) with adefault \code{tolerance} of 0.001 seconds, ignoring \code{scale}.A time zone mismatch between \code{target} and \code{current} isreported 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 vectorof \code{\link{mode}} \code{"character"} describing the differencesbetween \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 errord45 <- pi*(1/4 + 1:10) ; one <- rep(1, 10)tan(d45) == one # mostly FALSE, as not exactlystopifnot(all.equal(tan(d45), one)) # TRUE, but not if we are picky:all.equal(tan(d45), one, tolerance = 0) # to see differenceall.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 environmentsae <- all.equal(as.environment("package:stats"),asNamespace("stats"))stopifnot(is.character(ae), length(ae) > 10,## were incorrectly "considered equal" in R <= 3.1.1all.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 objectsnow <- 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}