`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