你重新分配==和!=到isTRUE(all.equal())?

时间:2011-10-05 15:44:43

标签: r

previous post提示我发布此问题。将==重新分配给isTRUE(all.equal())(以及!=!isTRUE(all.equal())似乎是一种最佳做法。我想知道其他人是否在实践中这样做了?我刚刚意识到这一点我使用==!=在我的代码库中进行数字相等。我的第一反应是我需要进行全擦洗并转换为all.equal。但事实上,每次我使用时==!=我想测试相等性(无论数据类型如何)。事实上,我不确定这些操作除了相等之外还会测试什么。我确定我错过了一些有人可以启发我吗?我看到这种方法的唯一论点是,在某些情况下,由于all.equal的容忍度,两个不相同的数字看起来是相同的。但我们被告知这两个数字实际上相同的可能不会传递identical(),因为它们是如何存储在内存中的。所以真的有什么不能默认为all.equal

1 个答案:

答案 0 :(得分:7)

正如@joran所提到的那样,你会在几乎任何其他语言中遇到==!=的浮点问题。 R中它们的一个重要方面是矢量化部分。

定义新功能almostEqualfuzzyEqual或类似功能会好得多。遗憾的是,没有这样的基础功能。 all.equal效率不高,因为它处理所有类型的对象,并返回一个字符串,用于描述差异,而大多数情况下只需要TRUEFALSE

这是一个这样的功能的例子。它像==一样被矢量化。

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