all.equal
位於 base
包(package)。 說明
all.equal(x, y)
是一個比較的實用程序R對象x
和y
測試“接近平等”。如果不同,仍然進行一定程度的比較,並返回差異報告。不使用all.equal
直接在if
表達式——或者使用isTRUE(all.equal(....))
或者identical
如果合適的話。
用法
all.equal(target, current, ...)
## S3 method for class 'numeric'
all.equal(target, current,
tolerance = sqrt(.Machine$double.eps), scale = NULL,
countEQ = FALSE,
formatFUN = function(err, what) format(err),
..., check.attributes = TRUE, giveErr = FALSE)
## S3 method for class 'list'
all.equal(target, current, ...,
check.attributes = TRUE, use.names = TRUE)
## S3 method for class 'environment'
all.equal(target, current, all.names = TRUE,
evaluate = TRUE, ...)
## S3 method for class 'function'
all.equal(target, current, check.environment=TRUE, ...)
## S3 method for class 'POSIXt'
all.equal(target, current, ..., tolerance = 1e-3, scale,
check.tzone = TRUE)
attr.all.equal(target, current, ...,
check.attributes = TRUE, check.names = TRUE)
參數
target |
R對象。 |
current |
其他R對象,與 |
... |
不同方法的進一步論證,特別是以下兩種方法,用於數值比較: |
tolerance |
數字 |
scale |
|
countEQ |
邏輯指示在計算平均(絕對或相對)差異時是否應計算 |
formatFUN |
兩個參數的 |
check.attributes |
邏輯指示是否應比較 |
giveErr |
|
use.names |
邏輯指示 |
all.names |
邏輯傳遞給 |
evaluate |
對於 |
check.environment |
邏輯上要求函數的 |
check.tzone |
邏輯指示是否應比較 |
check.names |
邏輯指示是否應比較 |
細節
all.equal
是一個通用函數,在 target
參數上調度方法。要查看可用的方法,請使用 methods("all.equal")
,但請注意,默認方法也會執行一些調度,例如對邏輯目標使用原始方法。
請記住,...
後麵的參數必須由(未縮寫的)名稱指定。不建議在 ...
中傳遞未命名參數,因為這些參數將匹配不同方法中的不同參數。
scale = NULL
(默認值)的數值比較通常采用相對差異尺度,除非 target
值接近零或無窮大。具體來說,比例計算為 target
的平均絕對值。如果該比例是有限的並且超過 tolerance
,則表示相對於它的差異;否則,使用絕對差異。請注意,此比例和所有進一步的步驟僅針對 target
不是 NA
且不同於 current
的向量元素進行計算。如果countEQ
為真,則在確定“sample” 大小時將計算相等和NA
情況。
如果 scale
是數字(且為正數),則在按 scale
縮放(除)後進行絕對比較。請注意,如果所有比例都接近 1(具體而言,在 1e-7 內),則差異仍報告為絕對比例。
對於複數 target
,使用差值的模 ( Mod
):調用 all.equal.numeric
,因此參數 tolerance
和 scale
可用。
list
方法遞歸地比較 target
和 current
的組件,傳遞所有其他參數,隻要兩者都是 “list-like”,即滿足 is.vector
或 is.list
。
environment
方法通過 list
方法工作,並且也用於引用類(除非定義了特定的 all.equal
方法)。
日期時間對象的方法使用 all.equal.numeric
將時間(以 "POSIXct"
表示形式)與默認的 tolerance
0.001 秒進行比較,忽略 scale
。除非 check.tzone = FALSE
,否則報告 target
和 current
之間的時區不匹配。
attr.all.equal
用於比較 attributes
,返回 NULL
或 character
向量。
值
TRUE
(NULL
for attr.all.equal
)或 mode
"character"
的向量說明 target
和 current
之間的差異。
例子
all.equal(pi, 355/113)
# not precise enough (default tol) > relative error
quarts <- 1/4 + 1:10 # exact
d45 <- pi*quarts ; one <- rep(1, 10)
tan(d45) == one # mostly FALSE, as typically exact; embarrassingly,
tanpi(quarts) == one # (is always FALSE (Fedora 34; gcc 11.2.1))
stopifnot(all.equal(
tan(d45), one)) # TRUE, but not if we are picky:
all.equal(tan(d45), one, tolerance = 0) # to see difference
all.equal(tan(d45), one, tolerance = 0, scale = 1)# "absolute diff.."
all.equal(tan(d45), one, tolerance = 0, scale = 1+(-2:2)/1e9) # "absolute"
all.equal(tan(d45), one, tolerance = 0, scale = 1+(-2:2)/1e6) # "scaled"
## advanced: equality of environments
ae <- all.equal(as.environment("package:stats"),
asNamespace("stats"))
stopifnot(is.character(ae), length(ae) > 10,
## were incorrectly "considered equal" in R <= 3.1.1
all.equal(asNamespace("stats"), asNamespace("stats")))
## A situation where 'countEQ = TRUE' makes sense:
x1 <- x2 <- (1:100)/10; x2[2] <- 1.1*x1[2]
## 99 out of 100 pairs (x1[i], x2[i]) are equal:
plot(x1,x2, main = "all.equal.numeric() -- not counting equal parts")
all.equal(x1,x2) ## "Mean relative difference: 0.1"
mtext(paste("all.equal(x1,x2) :", all.equal(x1,x2)), line= -2)
##' extract the 'Mean relative difference' as number:
all.eqNum <- function(...) as.numeric(sub(".*:", '', all.equal(...)))
set.seed(17)
## When x2 is jittered, typically all pairs (x1[i],x2[i]) do differ:
summary(r <- replicate(100, all.eqNum(x1, x2*(1+rnorm(x1)*1e-7))))
mtext(paste("mean(all.equal(x1, x2*(1 + eps_k))) {100 x} Mean rel.diff.=",
signif(mean(r), 3)), line = -4, adj=0)
## With argument countEQ=TRUE, get "the same" (w/o need for jittering):
mtext(paste("all.equal(x1,x2, countEQ=TRUE) :",
signif(all.eqNum(x1,x2, countEQ=TRUE), 3)), line= -6, col=2)
## Using giveErr=TRUE :
x1. <- x1 * (1+ 1e-9*rnorm(x1))
str(all.equal(x1, x1., giveErr=TRUE))
## logi TRUE
## - attr(*, "err")= num 8.66e-10
## - attr(*, "what")= chr "relative"
## Used with stopifnot(), still *showing* diff:
all.equalShow <- function (...) {
r <- all.equal(..., giveErr=TRUE)
cat(attr(r,"what"), "err:", attr(r,"err"), "\n")
c(r) # can drop attributes, as not used anymore
}
# checks, showing error in any case:
stopifnot(all.equalShow(x1, x1.)) # -> relative err: 8.66002e-10
tryCatch(error=identity, stopifnot(all.equalShow(x1, 2*x1))) -> eAe
cat(eaMsg <- conditionMessage(eAe), "\n")
stopifnot(inherits(eAe, "error"), # stopifnot() giving smart msg:
grepl("are not equal", eaMsg, fixed=TRUE))
## comparison of date-time objects
now <- Sys.time()
stopifnot(
all.equal(now, now + 1e-4) # TRUE (default tolerance = 0.001 seconds)
)
all.equal(now, now + 0.2)
all.equal(now, as.POSIXlt(now, "UTC"))
stopifnot(
all.equal(now, as.POSIXlt(now, "UTC"), check.tzone = FALSE) # TRUE
)
參考
Chambers, J. M. (1998)
Programming with Data. A Guide to the S Language.
Springer (for =
).
也可以看看
相關用法
- R all.names 查找表達式中的所有名稱
- R all 所有的值都是真的嗎?
- R apply 在數組邊距上應用函數
- R as.Date 日期與字符之間的轉換函數
- R agrep 近似字符串匹配(模糊匹配)
- R append 向量合並
- R assignOps 賦值運算符
- R as.POSIX* 日期時間轉換函數
- R asplit 按邊距分割數組/矩陣
- R attributes 對象屬性列表
- R abbreviate 縮寫字符串
- R aperm 數組轉置
- R args 函數的參數列表
- R attr 對象屬性
- R array2DF 將數組轉換為 DataFrame
- R autoload 按需加載包
- R attach 將一組 R 對象附加到搜索路徑
- R as.environment 強製環境對象
- R as.function 將對象轉換為函數
- R assign 為名稱分配值
- R any 有些值是真的嗎?
- R array 多路陣列
- R as.data.frame 強製數據幀
- R file.path 構造文件路徑
- R grep 模式匹配和替換
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Test if Two Objects are (Nearly) Equal。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。