Какая разница в 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
Другие вопросы по тегам