2013-07-22 2 views

Antwort

8

Sie mischen die Konventionen der Klassen S3 und S4. is und extends sind für S4-Klassen, aber diese arbeiten mit S3 wegen der Art, wie diese implementiert wurden. inherits wurde für S3-Klassen geschrieben und es ist nicht beabsichtigt, mit S4-Objekten mit voller Kompatibilität zu arbeiten.

inherits vergleicht effektiv das Ergebnis von class(x) mit der Klasse, die Sie im zweiten Argument angeben. Also

> class(data.frame()) 
[1] "data.frame" 

enthält keine "list" irgendwo so fehlschlägt.

Hinweis dies auch von ?inherits:

The analogue of ‘inherits’ for formal classes is ‘is’. The two 
functions behave consistently with one exception: S4 classes can 
have conditional inheritance, with an explicit test. In this 
case, ‘is’ will test the condition, but ‘inherits’ ignores all 
conditional superclasses. 

Eine weitere Verwirrung ist mit der Klasse eines Objekts und die Umsetzung dieses Objekts. Ja ein Datenrahmen ist eine Liste wie is.list() sagt uns, aber in R S3 Klasse Welt, data.frame() ist der Klasse nicht "list".

Wie für is(data.frame(),'list'), ist es nicht von dieser spezifischen Klasse "list" daher die FALSE. Welche is(data.frame()) hat sich in ?is

Summary of Functions: 

    ‘is’: With two arguments, tests whether ‘object’ can be treated as 
      from ‘class2’. 

      With one argument, returns all the super-classes of this 
      object's class 

dokumentiert Daher is(data.frame()) ist die Klassen zeigt, die die "data.frame"-Klasse (im S4 Sinn, nicht die S3 Sinn) erstreckt. Dies erklärt weiter das extends('data.frame','list') Verhalten als in der S4-Welt, die "data.frame" Klasse erweitert "list" Klasse.

Verwandte Themen