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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。