Подтвердить что ты не робот

Какая разница в R между одинаковыми (x, y) и isTRUE (all.equal(x, y))?

Есть ли разница между тестированием isTRUE(all.equal(x, y)) и identical(x, y)?

На странице справки говорится:

Не используйте 'all.equal' непосредственно в 'if'  выражения -или использовать 'isTRUE (all.equal(....))' или "если это необходимо".

но это "при необходимости" оставляет мне сомнения. Как я могу решить, какой из них подходит?

4b9b3361

Ответ 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 и formulaterms). Но чтобы проиллюстрировать, я дам два тривиальных объекта в разных (вновь созданных) средах:

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: логическое указание, следует ли игнорировать их среды при сравнении замыканий.

но поскольку он применяется только при сравнении замыканий (т.е. функций), это не делает разницы в этом случае - и это не будет иметь значения при сравнении формул или терминов объектов.