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?

War es hilfreich?

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

gefunden

R 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".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top