From jon.clayden at gmail.com  Tue Jul 28 12:58:06 2015
From: jon.clayden at gmail.com (Jon Clayden)
Date: Tue, 28 Jul 2015 11:58:06 +0100
Subject: [Rd] all.equal: possible mismatch between behaviour and
	documentation
Message-ID: <CAM9CR=1554BKxarByo5Jbi-DX4UznLO92hhpkL3JCesgb9Y=mg@mail.gmail.com>

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



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