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