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

Какая разница между и наследует?

Если я хочу проверить, наследует ли переменная какой-либо класс, я могу либо использовать is, либо inherits.

class(letters)
## [1] "character"
is(letters, "character")
## [1] TRUE
inherits(letters, "character")
## [1] TRUE

Есть ли предпочтение, для которого я должен использовать, и всегда ли они возвращают разные значения?

4b9b3361

Ответ 1

Краткая версия:

Используйте inherits, но будьте осторожны с числами и классами S4.


Более длинная версия:

В разделе "См. также" на странице справки is:

наследования почти всегда эквивалентны, как для S4, так и для не-S4 объектов, и несколько быстрее. Неэквивалентность применяется к классы, имеющие условные суперклассы, с нетривиальным критерием = в отношении (не распространены и не поощряются): для них - тесты для отношение, но наследует по определению, игнорирует условные наследование для объектов S4.

В разделе "Формальные классы" справочной страницы inherits:

Аналог наследований для формальных классов есть. Две функции вести себя с одним исключением: классы S4 могут иметь условное наследование, с явным тестом. В этом случае проверьте условие, но наследует игнорирует все условные суперклассы.

Таким образом, они в основном возвращают одно и то же, но inherits работает быстрее, поэтому в большинстве случаев это должен быть выбор по умолчанию. (Как упоминалось Конрадом, is также требует, чтобы пакет methods был загружен, что может сделать его непригодным для использования с учетом производительности Rscript.)

Значения могут отличаться, если вы используете классы S4 с условным наследованием, но это не рекомендуется (см. "Выбор метода и отправка: подробности" ), что означает, что он, надеюсь, редок.

Самое очевидное место, где две функции отличаются, - это проверять, являются ли целые числа числами.

class(1L)
## [1] "integer"
is.numeric(1L)
## [1] TRUE
is(1L, "numeric")
## [1] TRUE
inherits(1L, "numeric")
## [1] FALSE