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

SFu*_*n28 7 r

一个以前的帖子促使我张贴了这个问题.这似乎是一个最佳实践,以重新分配==isTRUE(all.equal())(和!=!isTRUE(all.equal()).我想知道如果别人这样做在实践中?我才意识到,我使用==,并!=在整个代码库我做数字的平等.我的第一反应是,我需要做的完全刷新并转换为all.equal.但事实上,每次我使用==并且!=我想测试相等性(无论数据类型).事实上,我不确定这些操作除了相等之外还会测试什么.我确定我在这里错过了一些概念.有人可以启发我吗?我看到这种方法的唯一论据是,在某些情况下,由于容忍度,两个不相同的数字看起来是相同的all.equal.但我们被告知两个数字实际上相同的可能不会identical()因为它们是如何存储在内存中而通过.所以真的有什么不是默认的all.equal

Tom*_*mmy 7

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

它会好得多定义一个新的功能almostEqual,fuzzyEqual或类似的.遗憾的是,没有这样的基础功能.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
Run Code Online (Sandbox Code Playgroud)

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