previous post提示我发布此问题。将==
重新分配给isTRUE(all.equal())
(以及!=
到!isTRUE(all.equal())
似乎是一种最佳做法。我想知道其他人是否在实践中这样做了?我刚刚意识到这一点我使用==
和!=
在我的代码库中进行数字相等。我的第一反应是我需要进行全擦洗并转换为all.equal
。但事实上,每次我使用时==
和!=
我想测试相等性(无论数据类型如何)。事实上,我不确定这些操作除了相等之外还会测试什么。我确定我错过了一些有人可以启发我吗?我看到这种方法的唯一论点是,在某些情况下,由于all.equal
的容忍度,两个不相同的数字看起来是相同的。但我们被告知这两个数字实际上相同的可能不会传递identical()
,因为它们是如何存储在内存中的。所以真的有什么不能默认为all.equal
?
答案 0 :(得分:7)
正如@joran所提到的那样,你会在几乎任何其他语言中遇到==
和!=
的浮点问题。 R中它们的一个重要方面是矢量化部分。
定义新功能almostEqual
,fuzzyEqual
或类似功能会好得多。遗憾的是,没有这样的基础功能。 all.equal
效率不高,因为它处理所有类型的对象,并返回一个字符串,用于描述差异,而大多数情况下只需要TRUE
或FALSE
。
这是一个这样的功能的例子。它像==
一样被矢量化。
almostEqual <- function(x, y, tolerance=1e-8) {
diff <- abs(x - y)
mag <- pmax( abs(x), abs(y) )
ifelse( mag > tolerance, diff/mag <= tolerance, diff <= tolerance)
}
almostEqual(1, c(1+1e-8, 1+2e-8)) # [1] TRUE FALSE
...对于标量值,它比all.equal
快2倍,而对于矢量则快得多。
x <- 1
y <- 1+1e-8
system.time(for(i in 1:1e4) almostEqual(x, y)) # 0.44 seconds
system.time(for(i in 1:1e4) all.equal(x, y)) # 0.93 seconds