42

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?

Ben Bolker
  • 211,554
  • 25
  • 370
  • 453
mariotomo
  • 9,438
  • 8
  • 47
  • 66

3 Answers3

36

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.

Joshua Ulrich
  • 173,410
  • 32
  • 338
  • 418
  • 2
    thanks, 'no tolerance' was the key: `all.equal(8.0, 9.0, tolerance=1.0)` – mariotomo Aug 03 '10 at 13:56
  • 2
    Another example is that `identical()` will say ints and longs are different, even if they have the same value, whereas `all.equal()` will say they're equal. – smci Feb 02 '17 at 08:27
20

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.

Ben Bolker
  • 211,554
  • 25
  • 370
  • 453
18

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
nullglob
  • 6,903
  • 1
  • 29
  • 31