当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R all.equal 测试两个对象是否(几乎)相等


R语言 all.equal 位于 base 包(package)。

说明

all.equal(x, y)是一个比较的实用程序R对象xy测试“接近平等”。如果不同,仍然进行一定程度的比较,并返回差异报告。不使用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对象,与target.

...

不同方法的进一步论证,特别是以下两种方法,用于数值比较:

tolerance

数字 0。不报告小于tolerance 的差异。默认值接近 1.5e-8

scale

NULL 或数字 > 0,通常长度为 1 或 length(target) 。查看具体信息'。

countEQ

逻辑指示在计算平均(绝对或相对)差异时是否应计算 target == current 案例。默认值 FALSEtargetcurrent 仅在少数地方不同的情况下可能会产生误导;请参阅广泛的示例。

formatFUN

两个参数的 functionerr ,相对、绝对或缩放误差,以及 what ,指示错误类型的字符串;例如,可以用于以不同的方式格式化相对和绝对误差。

check.attributes

逻辑指示是否应比较 targetcurrent(名称除外)的 attributes

giveErr

logical 指示结果是否应包含数字错误作为 "err" 属性。

use.names

逻辑指示 list 比较是否应按名称(如果匹配)而不是整数索引报告不同的组件。请注意,它位于 ... 之后,因此必须使用其全名来指定。

all.names

逻辑传递给ls,指示环境中是否还应考虑“hidden”对象。

evaluate

对于 environment 方法:logical 指示是否“应强制承诺”,即通常评估形式函数参数以进行比较。如果为 false,则仅检查两个环境中对象的 names 是否相等。

check.environment

逻辑上要求函数的 environment() 也应该进行比较。在意外情况下,您可能需要设置check.environment=FALSE,例如比较两个nls()拟合时。

check.tzone

逻辑指示是否应比较 targetcurrent"tzone" 属性。

check.names

逻辑指示是否应比较 targetcurrentnames(.)

细节

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 ,因此参数 tolerancescale 可用。

list 方法递归地比较 targetcurrent 的组件,传递所有其他参数,只要两者都是 “list-like”,即满足 is.vectoris.list

environment 方法通过 list 方法工作,并且也用于引用类(除非定义了特定的 all.equal 方法)。

日期时间对象的方法使用 all.equal.numeric 将时间(以 "POSIXct" 表示形式)与默认的 tolerance 0.001 秒进行比较,忽略 scale 。除非 check.tzone = FALSE ,否则报告 targetcurrent 之间的时区不匹配。

attr.all.equal 用于比较 attributes ,返回 NULLcharacter 向量。

TRUE (NULL for attr.all.equal )或 mode "character" 的向量说明 targetcurrent 之间的差异。

例子

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 =).

也可以看看

identicalisTRUE==all 用于精确相等测试。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Test if Two Objects are (Nearly) Equal。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。