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.
Eine weitere Funktion mit interessanten Informationen ist 'getClass ('data.frame')' – eddi