2010-03-18 18 views
5

Soy algo nuevo en R, y tengo este código que genera una variable que no conozco. ¿Hay alguna instalación de introspección en R que me dirá a qué tipo pertenece esta variable?Cómo hacer introspección en R

A continuación se ilustra la propiedad de esta variable:

estoy trabajando en la selección del modelo lineal, y el recurso que tengo es lm resultado de otro modelo. Ahora quiero recuperar la llamada lm mediante el comando summary (model) $ call para no tener que codificar la estructura del modelo. Sin embargo, dado que tengo que cambiar el conjunto de datos, necesito hacer un poco de modificación en la "cadena", pero aparentemente no es una cadena simple. Me pregunto si hay algún comando similar a string.replace para poder manipular esta variable desde la variable $ call.

> str<-summary(rdnM)$call 
> str 
lm(formula = y ~ x1, data = rdndat) 
> str[1] 
lm() 
> str[2] 
y ~ x1() 
> str[3] 
rdndat() 
> str[3] <- data 
Warning message: 
In str[3] <- data : 
    number of items to replace is not a multiple of replacement length 
> str 
lm(formula = y ~ x1, data = c(10, 20, 30, 40)) 
> str<-summary(rdnM)$call 
> str 
lm(formula = y ~ x1, data = rdndat) 
> str[3] <- 'data' 
> str 
lm(formula = y ~ x1, data = "data") 
> str<-summary(rdnM)$call 
> type str 
Error: unexpected symbol in "type str" 
> 
+5

se podría empezar por leer * una introducción a R * que es uno de los manuales que vienen con R. no Considere el uso de nombres de funciones clave para sus datos - 'str()' es una de las funciones más importantes para mirar la estructura. Por último, 'typeof()' y 'class()' pueden ser útiles. –

Respuesta

4

En términos de introspección: R le permite examinar y operar con facilidad objetos de lenguaje.
Para obtener más información, consulte R Language Definition, especialmente las secciones 2 y 6. Por ejemplo, en su caso, el resumen (rdnM) $ call es un objeto de "llamada". Puede recuperar fragmentos de ellos indexándolos, pero no puede construir otro objeto de llamada asignando índices como los que intenta hacer. Tendría que construir una nueva llamada.

En su caso está construyendo una llamada actualizada a lm() de una llamada existente. Si desea volver a utilizar la fórmula de datos diferentes, se extraería la fórmula del objeto llamada a través formula(foo$call), así:

foo <- lm(formula = y ~ x1, data = data.frame(y=rnorm(10),x1=rnorm(10))) 
bar <- lm(formula(foo$call), data = data.frame(y=rnorm(10),x1=rnorm(10))) 

Por otro lado, si usted está tratando de actualizar la fórmula, se puede usar update():

baz <- update(bar, . ~ . - 1) 
baz$call 
##>lm(formula = y ~ x1 - 1, data = data.frame(y = rnorm(10), x1 = rnorm(10))) 
Cuestiones relacionadas