相同(x,y)和isTRUE(all.equal(x,y))之间的R有什么不同?

mar*_*omo 31 comparison equality r built-in floating-point-comparison

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

帮助页面说:

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

但"如果合适的话"让我怀疑.我如何确定哪两个合适?

Jos*_*ich 29

all.equal测试近似相等,而identical更精确(例如,它不容许差异,并且它比较存储类型).来自?相同:

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

个中缘由,你想包all.equalisTRUE是因为all.equal报告的差异,而不是简单地返回FALSE.

  • 谢谢,'没有宽容'是关键:`all.equal(8.0,9.0,tolerance = 1.0)` (2认同)
  • 另一个例子是,“identical()”会说 int 和 long 不同,即使它们具有相同的值,而“all.equal()”会说它们相等。 (2认同)

nul*_*lob 13

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
Run Code Online (Sandbox Code Playgroud)


Ben*_*ker 13

除了数值容差的差异和存储模式的比较之外,不同的是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
Run Code Online (Sandbox Code Playgroud)

有一个ignore.environment论点:

ignore.environment:逻辑,指示在比较闭包时是否应忽略其环境.

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