2015-01-13 5 views
13

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

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

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

+0

Вы уверены, что не хотите тег 'r-faq' на этом? –

ответ

9

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

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


Longer версия:

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

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

В разделе формальных классов страницы inherits справки:

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

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

Значения может отличаться, если вы используете классы S4 с условным наследованием, но это not recommended (см. Раздел «Выбор метода и отправка: детали»), что означает, что он, надеюсь, встречается редко.

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

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

ОК, так что вы можете объяснить ** почему ** целые числа не наследуют, тогда как float делают: Rgames> class (1.4) [1] "numeric" Rgames> is.numeric (1.4) [1] TRUE Rgames> inherits (1.4, 'numeric') [1] TRUE Rgames> is (1.4, 'numeric') [1] TRUE –

+2

Я думаю, это может быть связано с тем, * class only: from '? class',' Если объект не имеет атрибута класса, он имеет неявный класс, '' матрицу '', '' array '' или результат 'mode (x)' (кроме что целые векторы имеют неявный класс «целое число»). «Я могу себе представить (??), что 'is' смотрит на неявные классы, а' inherits' не ...? –

+0

Помню, я слышал, как я услышал комментарий высокопоставленных субъектов, назвавших это «нечеловечеством». –