same(x,y)和isTRUE(all.equal(x,y))有什么区别?

问题描述 投票:32回答:3

isTRUE(all.equal(x, y))identical(x, y)的测试之间有区别吗?

帮助页面上说:

请勿在'if'中直接使用'all.equal'表达式-使用'isTRUE(all.equal(....))'或如果适用,则“相同”。

但是那个“如果合适的话”让我存疑。如何确定两者中的哪一个合适?

r comparison equality built-in floating-point-comparison
3个回答
30
投票

all.equal测试几乎相等,而identical更精确(例如,对差异无容忍度,并且比较存储类型)。从?identical:

功能'all.equal'也是有时用来测试是否相等的方式,但旨在不同:它允许小数字结果的差异。

并且您将all.equal包装在isTRUE中的原因之一是因为all.equal报告差异,而不是简单地返回FALSE


14
投票

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

14
投票

除了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:逻辑指示在比较闭包时是否应忽略其环境。

但是由于仅在比较闭包(即函数)时才应用,因此在这种情况下不会有所不同-在比较公式或术语对象时也不会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.