Как намекал @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
... он примерно в 2 раза быстрее, чем all.equal
для скалярных значений, и намного быстрее с векторами.
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