Domanda

ci Utilizzando la funzione class permette di determinare la classe di un oggetto:

> x = 5
> class(x)
[1] "numeric"

capisco anche che siamo in grado di utilizzare il comando is.object per determinare se un oggetto ha una classe. Tuttavia alcuni tipi di oggetti sono impliciti, cioè

> is.object(x)
[1] FALSE

sarebbe corretto affermare che tutte le variabili in R sono oggetti e is.object è un test solo per le classi non-impliciti?

Inoltre, come si fa tipi rientrano in questo. Ingenuamente, ho pensato che il seguente pezzo di codice produrrebbe un errore:

> x = 5
> class(x) = "fake"
> x = X + 1
> x + 1
[1] 6
attr(,"class")
[1] "fake"

Ma x ha ancora tipo "doppio", ancora tutto funziona ancora. tipi possono essere considerati come una superclasse che tutti gli altri oggetti ereditano da?

È stato utile?

Soluzione

typeof restituisce il tipo di rappresentazione interna C, e non viene utilizzato per il metodo di spedizione. Quindi a rigor di termini, non si può pensare di tipi come "superclassi".

Non ci sono invece classi di base (numerico, carattere, la lista, la funzione, ecc), che corrispondono a circa i nomi restituito da typeof, ma non sempre (ad esempio tipo è doppia di classe numerico speciale e chiusura sono di classe la funzione, e la classe data.frame è di tipo list!).

Con i sistemi di S3 e S4 si può costruire classi non banali che utilizzano le classi di base. (Ma che si estende non è necessario uno di quelli !! esempio: setClass("foo", list(a="numeric",b="character") non si estende una delle classi di base )

Per gli oggetti di queste classi di base is.object rendimenti FALSE. Come la sua documentazione dice, questa funzione fornisce un modo molto veloce per verificare se l'oggetto è di costruzione utente S3 o S4 classe (cioè non uno di classi di base).

Dopo la fusione x come "falso" l'oggetto è formalmente non di classe "numerico":

is(x, "numeric")
#FALSE

ma è interpretabile come base oggetto "numerico":

is.numeric(x)
#TRUE

E questo è il motivo per cui + lavora qui. Così, internamente, come già detto @Richie le interpreta come metodo predefinito x di Classe base numerica.

Questa confusione concettuale è a causa della S3 trattamento informale di classi. Usa S4 invece.


corrispondenza tra typeof e la classe di base (.) (.):

                              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"

Altri suggerimenti

Una risposta parziale alla prima domanda si trova nel capitolo 2 della lingua R defninition

R non fornisce accesso diretto a la memoria del computer, ma piuttosto fornisce una serie di dati specializzate strutture si farà riferimento a come oggetti. Questi oggetti sono denominati attraverso simboli o variabili. In R, tuttavia, i simboli stessi sono oggetti e può essere manipolato in così come qualsiasi altro oggetto.

Quindi, sì, tutte le variabili sono oggetti.

is.object sembra essere più o meno equivalente a function(x) !is.null(attr(x, "class")) ma io sono disposto a essere smentito su questo.

Per quanto riguarda la seconda domanda, credo che questo è ciò che accade: Dal momento che x ha classe "falso", sguardi R per un metodo +.fake in aggiunta, ma quando esso non trova uno, ricorre al metodo di default. Tale metodo predefinito si basa sul sottostante codice C, che utilizza typeof(x) (o un equivalente C) per determinare cosa deve essere fatto. In questo caso il tipo di x è "integer".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top