isTRUE(all.equal(x, y))
测试和测试有什么区别identical(x, y)
吗?
帮助页面说:
不要在 'if' 表达式中直接使用 'all.equal' - 如果合适,可以使用 'isTRUE(all.equal(....))' 或 'identical'。
但“如果合适”让我怀疑。我如何决定这两者中的哪一个是合适的?
isTRUE(all.equal(x, y))
测试和测试有什么区别identical(x, y)
吗?
帮助页面说:
不要在 'if' 表达式中直接使用 'all.equal' - 如果合适,可以使用 'isTRUE(all.equal(....))' 或 'identical'。
但“如果合适”让我怀疑。我如何决定这两者中的哪一个是合适的?
all.equal
测试近似相等,whileidentical
更精确(例如,它不容忍差异,并且比较存储类型)。从 ? 相同的:
函数 'all.equal' 有时也用于以这种方式测试相等性,但它的目的是不同的:它允许数值结果的微小差异。
一个你会换行all.equal
的原因isTRUE
是因为all.equal
会报告差异而不是简单地返回FALSE
。
除了数值容差的差异和存储模式的比较,与 不同all.equal()
,identical
还测试关联环境的相等性。R 中的常规对象通常没有关联的环境——它们最常与function
和formula
(和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:逻辑指示在比较闭包时是否应忽略它们的环境。
但由于它仅在比较闭包(即函数)时应用,因此在这种情况下它不会产生影响 - 在比较公式或术语对象时也不会产生影响。
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