如果target
大於tolerance
,它似乎檢查relative error <= tolerance
。也就是說,在abs(current-target)/target <= tolerance
:
all.equal(target, current, tolerance)
對於前:
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例子中的必要部分)是: 從target
和current
刪除任何NA和相等值(的target
和current
)。然後計算xy
作爲target
和current
的平均絕對差值。但是決定是否將要relative
或absolute
取決於部分what
。這裏xy
沒有檢查任何條件。它取決於只有在xn
這是mean(abs(target))
。
所以,最後,由OP粘貼部分(粘貼在這裏爲方便起見):
如果這(意思,平均絕對差)是小於公差或不是有限的,絕對的使用差異,否則通過平均絕對差異縮放相對差異。
似乎是錯誤/誤導。
+1打算髮布幾乎相同的東西。 – juba 2013-03-11 09:20:04
這意味着文檔不正確或我閱讀幫助文件錯誤? – Roland 2013-03-11 09:34:02
@Roland,無論是「相對」還是「絕對」差異計算似乎都只依賴*目標,至少從代碼來看。糾正我,如果我錯了。我認爲這些文件是誤導性的。我會添加更多詳細的代碼以進一步闡明。 – Arun 2013-03-11 09:48:34