Pregunta

s Uso de la función class permite determinar la clase de un objeto:

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

También entiendo que podemos utilizar el comando is.object para determinar si un objeto tiene una clase. Sin embargo, algunos tipos de objetos están implícitos, es decir

> is.object(x)
[1] FALSE

¿Sería correcto afirmar que todas las variables en I son objetos y is.object es una prueba para clases no sólo implícitas?

Además, ¿cómo hacer tipos encajan en esto. Ingenuamente, pensé que el siguiente fragmento de código podría producir un error:

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

Pero x todavía tiene el tipo "doble", siendo todo sigue funcionando. Se puede pensar tipos de como una superclase que todos los demás objetos heredan de?

¿Fue útil?

Solución

typeof devuelve el tipo de representación interna C, y no se utiliza para el envío método. Así que en sentido estricto no se puede pensar en tipos como "superclases".

Hay lugar clases básicas (numérico, carácter, lista, función, etc.), que corresponden aproximadamente a los nombres devuelto por typeof, pero no siempre (por ejemplo, tipo doble es de clase numérica, especial y de cierre son de clase función y hoja.de.datos clase está lista tipo!).

Con los sistemas de S3 y S4 se puede construir clases no triviales utilizando clases básicas. (Pero que se extiende no necesaria de aquellos !! ejemplo: setClass("foo", list(a="numeric",b="character") no se extiende cualquiera de los clases básicas )

Para los objetos de estas clases básicas is.object vuelve FALSE. Como dice su documentación, esta función ofrece una manera muy rápida para verificar si el objeto es de usuario acumulación S3 o S4 clase (es decir, no una de las clases básicas).

Después de la colada x como "falso" el objeto es formalmente no de clase "numérico":

is(x, "numeric")
#FALSE

pero es interpretable como objeto básico "numérico":

is.numeric(x)
#TRUE

Y esta es la razón por + trabaja aquí. Así, a nivel interno, como ya se dijo @Richie los interpreta como método predeterminado de x clase básica numérico.

Este desorden conceptual es debido S3 tratamiento informal de clases. Uso S4 en su lugar.


correspondencia entre typeof y clase básica (.) (.):

                              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"

Otros consejos

Una respuesta parcial a la primera pregunta se encuentra en el Capítulo 2 de la lengua R defninition

R no proporciona acceso directo a la memoria del ordenador, sino más bien proporciona un número de datos especializada estructuras nos referiremos como objetos. Estos objetos se denominan a través de símbolos o variables. En R, sin embargo, los símbolos son en sí mismos Objetos y puede ser manipulado en el mismo modo que cualquier otro objeto.

Así que, sí, todas las variables son objetos.

is.object parece ser más o menos equivalente a function(x) !is.null(attr(x, "class")) pero estoy dispuesto a estar equivocado en eso.

En cuanto a la segunda pregunta, creo que esto es lo que sucede: Desde x tiene clase "falso", miradas R para una +.fake método de la adición, pero cuando no encuentra uno, se recurre al método por defecto. Ese método predeterminado se basa en que subyace en código C, que utiliza typeof(x) (o un equivalente de C) para determinar lo que debe hacerse. En este caso el tipo de x es "número entero".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top