all.equal
, relative vs absolute
The
all.equal()
function is useful to comparing whether two numeric objects are
equivalent, but it has a weird quirk.
all.equal(4, 5)
## [1] "Mean relative difference: 0.25"
You might expect that the difference should be 1. But note the “relative
difference.” The default for all.equal
is to report the
difference for a call of all.equal(x, y)
as |x - y|/x. This
also means that all.equal(x, y)
is not going to report the
same difference as all.equal(y, x)
.
The scale=
argument makes all.equal
instead
report absolute difference:
all.equal(4, 5, scale = 1)
## [1] "Mean absolute difference: 1"
This comes in especially with the tolerance=
argument.
Let’s say you want to consider two values “equal” if they’re less than
.5 apart.
all.equal(4, 4.4, tolerance = .5)
## [1] TRUE
all.equal(4, 5, tolerance = .5)
## [1] TRUE
That second one is clearly wrong. However, if we set the
scale=
argument to 1, the tolerance is applied on the
absolute scale instead.
all.equal(4, 5, tolerance = .5, scale = 1)
## [1] "Mean absolute difference: 1"
Home |
Back to blog
This work is licensed under
CC BY-NC 4.0