gpt4 book ai didi

r - 您是否将 == 和 != 重新分配给 isTRUE( all.equal() )?

转载 作者:行者123 更新时间:2023-12-04 11:46:57 25 4
gpt4 key购买 nike

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

最佳答案

正如@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

...它比 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

关于r - 您是否将 == 和 != 重新分配给 isTRUE( all.equal() )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7664017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com