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

时间:2010-08-03 10:38:14

标签: r comparison equality built-in floating-point-comparison

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

帮助页面显示:

  

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

但“如果合适”让我有疑问。我如何决定哪两个合适?

3 个答案:

答案 0 :(得分:26)

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

  

函数'all.equal'也是   有时用来测试这个相等   方式,但是用于某事   不同:它允许小   数字结果的差异。

all.equal包裹在isTRUE中的一个原因是因为all.equal 报告差异而不是简单地返回FALSE

答案 1 :(得分: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

答案 2 :(得分:10)

除了数值容差的差异和存储模式的比较之外,与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:逻辑,指示在比较闭包时是否应忽略其环境。

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