is.object und das S3-Klasse-System
Frage
Mit der class
Funktion ermöglicht es uns, die Klasse eines Objekts zu bestimmen:
> x = 5
> class(x)
[1] "numeric"
Ich verstehe auch, dass wir den is.object
Befehl verwenden können, um zu bestimmen, ob ein Objekt eine Klasse hat. Allerdings sind einige Objekttypen implizit, dh
> is.object(x)
[1] FALSE
Sei es in dem Zustand richtig sein, dass alle Variablen in R sind Objekte und is.object
nur ein Test für nicht-implizite Klassen ist?
Auch Wie passen Typen in diesen. Naiv, dachte ich, dass das folgende Stück Code würde einen Fehler erzeugen:
> x = 5
> class(x) = "fake"
> x = X + 1
> x + 1
[1] 6
attr(,"class")
[1] "fake"
Aber x
hat immer noch „doppelte“ geben, noch alles noch funktioniert. Kann Arten als übergeordnete Klasse gedacht werden, dass alle anderen Objekte erben von?
Lösung
typeof
gibt die Art der internen Darstellung C, und es ist nicht für die Versendung Verfahren verwendet. So streng genommen nicht von Typen wie „Super“ denken kann.
Es gibt stattdessen Grundklassen (nummerisch, Zeichen, Liste, Funktion usw.), die in etwa den Namen entsprechen
von typeof
zurückgegeben, aber nicht immer (für Doppel Beispiel Typ der Klasse numerisch ist, besondere und Schließung ist die Klasse
Funktion und Klasse data.frame ist die Typenliste!).
Mit S3 und S4-Systemen können Sie nicht triviale Klassen Basisklassen bauen. (Aber nicht notwendig Verlängerung einer von denen !! Beispiel: setClass("foo", list(a="numeric",b="character")
keine der Grundklassen erstreckt )
Für die Objekte aus diesen Basisklassen is.object
kehrt FALSE
. Wie die Dokumentation sagt, bietet diese Funktion
eine sehr schnelle Art und Weise zu überprüfen, ob das Objekt der Benutzer Build S3 oder S4-Klasse (das heißt nicht einer der Basisklassen) ist.
Nach dem Gießen x
als „fake“ Ihre Aufgabe ist es formal nicht von „numerisch“ Klasse:
is(x, "numeric")
#FALSE
aber es ist interpretierbar als basic "numerisch" Objekt:
is.numeric(x)
#TRUE
Und deshalb +
hier funktioniert. Also, intern, wie @Richie bereits gesagt, die Standard-Methode interpretiert x
ab
numerische Basisklasse.
Dieses konzeptionelle Chaos ist wegen S3 informeller Behandlung von Klassen. Verwenden S4 statt.
Korrespondenz zwischen typeof und Basisklasse (.) (.):
typeof(.) class(.)
NULL "NULL" "NULL"
1 "double" "numeric"
1:1 "integer" "integer"
1i "complex" "complex"
list(1) "list" "list"
data.frame(x=1) "list" "data.frame"
pairlist(pi) "pairlist" "pairlist"
c "special" "function"
lm "closure" "function"
formals(lm)[[1]] "symbol" "name"
formals(lm)[[2]] "symbol" "name"
y~x "language" "formula"
expression((1))[[1]] "language" "("
(y~x)[[1]] "symbol" "name"
expression(x <- pi)[[1]][[1]] "symbol" "name"
Andere Tipps
Eine partielle Antwort auf die erste Frage wird in Kapitel 2 der R Sprache defninition
gefundenR bietet keinen direkten Zugang zu Speicher des Computers, sondern bietet eine Reihe von spezialisierten Daten Strukturen werden wir als verweisen Objekte. Diese Ziele werden genannt durch Symbole oder Variablen. In R, jedoch sind die Symbole selbst Objekte und kann in die manipuliert werden genauso wie jedes andere Objekt.
Also, ja, sind alle Variablen Objekte.
is.object
scheint mehr oder weniger gleichwertig function(x) !is.null(attr(x, "class"))
zu sein, aber ich bin bereit, falsch zu beweisen, dass auf.
Was die zweite Frage, ich denke, das ist, was passiert:
Da x
hat Klasse „fake“, R sieht für ein Verfahren +.fake
in der Zugabe, aber wenn es einen nicht findet, greift sie auf die Standard-Methode. Das Standard-Verfahren basiert auf C-Code zugrunde liegen, die typeof(x)
verwendet (oder ein C-äquivalent) zu bestimmen, was getan werden soll. In diesem Fall ist die Art von x
ist "integer".