Какая разница в R между одинаковыми (x, y) и isTRUE (all.equal(x, y))?
Есть ли разница между тестированием isTRUE(all.equal(x, y))
и identical(x, y)
?
На странице справки говорится:
Не используйте 'all.equal' непосредственно в 'if' выражения -или использовать 'isTRUE (all.equal(....))' или "если это необходимо".
но это "при необходимости" оставляет мне сомнения. Как я могу решить, какой из них подходит?
Ответы
Ответ 1
all.equal
тесты для близкого равенства, а identical
более точны (например, он не допускает различий и сравнивает тип хранилища). От? Идентичны:
Функция 'all.equal также иногда используется для проверки равенства путь, но был предназначен для чего-то разные: он позволяет различия в числовых результатах.
И одна из причин, по которой вы переносите all.equal
в isTRUE
, состоит в том, что all.equal
будет сообщать о различиях, а не просто возвращать FALSE
.
Ответ 2
identical
более суетливый. Например:
> identical(as.double(8), as.integer(8))
[1] FALSE
> all.equal(as.double(8), as.integer(8))
[1] TRUE
> as.double(8) == as.integer(8)
[1] TRUE
Ответ 3
Помимо различий в числовом допуске и сравнении режима хранения, в отличие от all.equal()
, identical
также проверяет равенство связанных сред. У обычных объектов в R обычно нет связанных сред - они чаще всего связаны с объектами function
и formula
(и terms
). Но чтобы проиллюстрировать, я дам два тривиальных объекта в разных (вновь созданных) средах:
x <- 2; environment(x) <- new.env()
y <- 2; environment(y) <- new.env()
all.equal(x,y) ## TRUE
identical(x,y) ## FALSE
Существует аргумент ignore.environment
:
ignore.environment: логическое указание, следует ли игнорировать их среды при сравнении замыканий.
но поскольку он применяется только при сравнении замыканий (т.е. функций), это не делает разницы в этом случае - и это не будет иметь значения при сравнении формул или терминов объектов.