37

isTRUE(all.equal(x, y))测试和测试有什么区别identical(x, y)吗?

帮助页面说:

不要在 'if' 表达式中直接使用 'all.equal' - 如果合适,可以使用 'isTRUE(all.equal(....))' 或 'identical'。

但“如果合适”让我怀疑。我如何决定这两者中的哪一个是合适的?

4

3 回答 3

33

all.equal测试近似相等,whileidentical更精确(例如,它不容忍差异,并且比较存储类型)。从 ? 相同的:

函数 'all.equal' 有时也用于以这种方式测试相等性,但它的目的是不同的:它允许数值结果的微小差异。

一个你会换行all.equal的原因isTRUE是因为all.equal报告差异而不是简单地返回FALSE

于 2010-08-03T11:35:57.727 回答
19

除了数值容差的差异和存储模式的比较,与 不同all.equal()identical还测试关联环境的相等性。R 中的常规对象通常没有关联的环境——它们最常与functionformula(和terms)对象关联。但为了说明,我将给出两个不同(新创建的)环境的琐碎对象:

x <- 2; environment(x) <- new.env()
y <- 2; environment(y) <- new.env()
all.equal(x,y)   ## TRUE
identical(x,y)   ## FALSE

有一个ignore.environment说法:

ignore.environment:逻辑指示在比较闭包时是否应忽略它们的环境。

但由于它仅在比较闭包(即函数)时应用,因此在这种情况下它不会产生影响 - 在比较公式或术语对象时也不会产生影响。

于 2015-10-11T23:54:59.083 回答
18

identical比较挑剔。例如:

> identical(as.double(8), as.integer(8))
[1] FALSE
> all.equal(as.double(8), as.integer(8))
[1] TRUE
> as.double(8) == as.integer(8)
[1] TRUE
于 2010-08-03T11:38:59.890 回答