[Rd] all.equal: possible mismatch between behaviour and documentation

Jon Clayden jon.clayden at gmail.com
Tue Jul 28 12:58:06 CEST 2015


Dear all,

The documentation for `all.equal.numeric` says

    Numerical comparisons for ‘scale = NULL’ (the default) are done by
    first computing the mean absolute difference of the two numerical
    vectors.  If this is smaller than ‘tolerance’ or not finite,
    absolute differences are used, otherwise relative differences
    scaled by the mean absolute difference.

But the actual behaviour of the function is to use relative
differences if the mean value of the first argument is greater than
`tolerance`:

    all.equal(0.1, 0.102, tolerance=0.01)
    # [1] "Mean relative difference: 0.02"

It seems to me that this example should produce `TRUE`, because
abs(0.1-0.102) < 0.01, but it does not, because abs(0.1) > 0.01. The
relevant section in the source seems to be

    what <- if (is.null(scale)) {
        xn <- mean(abs(target))
        if (is.finite(xn) && xn > tolerance) {
            xy <- xy/xn
            "relative"
        }
        else "absolute"
    }

I think `xy`, not `xn`, should be tested here.

The last line of the documentation, indicating that relative
differences are "scaled by the mean absolute difference" also seems
not to match the code, but in this aspect the code is surely right,
i.e., the relative difference is relative to the mean value, not the
mean difference.

All the best,
Jon



More information about the R-devel mailing list