2013-07-22 9 views
7

Jakie jest wytłumaczenie następującego zachowania?W R, inne zachowanie między `is.list (x)` i `is (x, 'list')`

is.list(data.frame()) ## TRUE 
is(data.frame(),'list') ## FALSE 
is(data.frame()) ## "data.frame" "list" "oldClass" "vector" 
extends('data.frame','list') ## TRUE 
inherits(data.frame(),'list') ## FALSE 
+0

Inną funkcją o ciekawych informacjach jest 'getClass (" data.frame ")' – eddi

Odpowiedz

8

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ę .