What's the difference between identical(x, y) and isTRUE(all.equal(x, y))?
Is there any difference between testing isTRUE(all.equal(x, y))
and identical(x, y)
?
The help page says:
Don't use 'all.equal' directly in 'if' expressions — either use 'isTRUE(all.equal(....))' or 'identical' if appropriate.
but that "if appropriate" leaves me in doubt. How do I decide which of the two is appropriate?
all.equal
tests for near equality, while identical
is more exact (e.g. it has no tolerance for differences, and it compares storage type). From ?identical:
The function ‘all.equal’ is also sometimes used to test equality this way, but was intended for something different: it allows for small differences in numeric results.
And one reason you would wrap all.equal
in isTRUE
is because all.equal
will report differences rather than simply return FALSE
.
In addition to differences in numerical tolerance and comparison of storage mode, unlike all.equal()
, identical
also tests equality of associated environments. Regular objects in R don't normally have associated environments -- they are most commonly associated with function
and formula
(and terms
) objects. But to illustrate, I'll give two trivial objects different (newly created) environments:
x <- 2; environment(x) <- new.env()
y <- 2; environment(y) <- new.env()
all.equal(x,y) ## TRUE
identical(x,y) ## FALSE
There is an ignore.environment
argument:
ignore.environment: logical indicating if their environments should be ignored when comparing closures.
but since it is only applied when comparing closures (i.e. functions), it doesn't make a difference in this case - nor will it make a difference when comparing formulae or terms objects.
identical
is fussier. For example:
> identical(as.double(8), as.integer(8))
[1] FALSE
> all.equal(as.double(8), as.integer(8))
[1] TRUE
> as.double(8) == as.integer(8)
[1] TRUE