Какая разница в R между одинаковыми (x, y) и isTRUE(all.equal(x, y))?
Есть ли разница между тестированием isTRUE(all.equal(x, y))
а также identical(x, y)
?
На странице справки написано:
Не используйте "all.equal" непосредственно в "if" выражениях - либо используйте "isTRUE(all.equal(....))", либо "identifier", если необходимо.
но это "если уместно" заставляет меня сомневаться. Как мне решить, какой из двух подходит?
3 ответа
all.equal
тесты на близкое равенство, в то время как identical
является более точным (например, он не допускает различий и сравнивает тип хранения). Из? Одинаковых:
Функция all.equal также иногда используется для проверки равенства таким образом, но предназначалась для чего-то другого: она допускает небольшие различия в числовых результатах.
И одна из причин, вы бы обернуть all.equal
в isTRUE
это потому что all.equal
будет сообщать о различиях, а не просто возвращать FALSE
,
В дополнение к различиям в численном допуске и сравнении режима хранения, в отличие от 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: логическое указание, следует ли игнорировать их среды при сравнении замыканий.
но поскольку он применяется только при сравнении замыканий (т. е. функций), в этом случае это не имеет значения, равно как и при сравнении формул или терминов объектов.
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