测试isTRUE(all.equal(x, y))
和identical(x, y)
之间有什么区别吗?
帮助页面显示:
请勿在'if'中直接使用'all.equal' 表达式 - 使用'isTRUE(all.equal(....))'或 如果合适,“相同”。
但“如果合适”让我有疑问。我如何决定哪两个合适?
答案 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中的常规对象通常不具有关联环境 - 它们通常与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:逻辑,指示在比较闭包时是否应忽略其环境。
但由于它仅在比较闭包(即函数)时应用,因此在这种情况下不会产生影响 - 在比较公式或术语对象时也不会产生差异。