Mieszanie konwencji klas S3 i S4. is
i extends
są dla klas S4, ale te działają z S3 ze względu na sposób, w jaki zostały one zaimplementowane. inherits
został napisany dla klas S3 i nie jest przeznaczony do pracy z obiektami S4 z pełną kompatybilnością.
inherits
skutecznie porównuje wynik class(x)
z klasą określoną w drugim argumencie. W związku z tym
> class(data.frame())
[1] "data.frame"
nie zawiera "list"
wszędzie zawiedzie.
Należy również zauważyć to od ?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.
Innym zamieszanie jest z klasą obiektu i realizacji tego obiektu. Tak, ramka danych jest listą, jak mówi is.list()
, ale w świecie klasy R w klasie S3 data.frame()
jest klasy "data.frame"
, a nie "list"
.
Jeśli chodzi o is(data.frame(),'list')
, to nie jest ona z tej konkretnej klasy "list"
, stąd FALSE
. Co is(data.frame())
nie jest udokumentowana w ?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
Stąd is(data.frame())
pokazuje klas, które rozszerza klasę "data.frame"
(w sensie S4, nie zmysłowej S3). To dalej tłumaczy zachowanie extends('data.frame','list')
jak w świecie S4, klasa "data.frame"
ma rozszerzyć klasę .
Inną funkcją o ciekawych informacjach jest 'getClass (" data.frame ")' – eddi