Ответ 1
Если target
больше, чем tolerance
, похоже, для relative error <= tolerance
. То есть abs(current-target)/target <= tolerance
в:
all.equal(target, current, tolerance)
Для ex:
all.equal(3, 6, tolerance = 1)
# TRUE --> abs(6-3)/3 <= 1
Вместо этого, если target
меньше, чем tolerance
, all.equal
использует mean absolute difference
.
all.equal(0.01, 4, tolerance = 0.01)
# [1] "Mean absolute difference: 3.99"
all.equal(0.01, 4, tolerance = 0.00999)
# [1] "Mean relative difference: 399"
all.equal(4, 0.01, tolerance = 0.01)
# [1] "Mean relative difference: 0.9975"
Однако это не то, о чем говорится в документации. Чтобы узнать, почему это происходит, давайте посмотрим на соответствующий фрагмент из all.equal.numeric
:
# take the example: all.equal(target=0.01, current=4, tolerance=0.01)
cplx <- is.complex(target) # FALSE
out <- is.na(target) # FALSE
out <- out | target == current # FALSE
target <- target[!out] # = target (0.01)
current <- current[!out] # = current (4)
xy <- mean((if(cplx) Mod else abs)(target - current)) # else part is run = 3.99
# scale is by default NULL
what <- if (is.null(scale)) {
xn <- mean(abs(target)) # 0.01
if (is.finite(xn) && xn > tolerance) { # No, xn = tolerance
xy <- xy/xn
"relative"
}
else "absolute" # this is computed for this example
}
else {
xy <- xy/scale
"scaled"
}
Все, что проверяется в приведенном выше коде (показаны только необходимые части для примера из OP): удалить любые NA и равные значения (target
и current
) из target
и current
. Затем вычислите xy
как среднюю абсолютную разность target
и current
. Но решение о том, будет ли оно relative
или absolute
, зависит от части what
. И здесь xy
не проверяется ни на какие условия. Это зависит только от xn
, которое mean(abs(target))
.
Итак, в заключение, часть, вставленная OP (вставлена здесь для удобства):
Если это (значение, означает абсолютную разницу) меньше, чем допуск или не конечный, используются абсолютные различия, в противном случае относительные различия масштабируются по средней абсолютной разности.
кажется неправильным/вводящим в заблуждение.