2012-05-23 14 views
14

Me pregunto cómo funciona la asignación en el lenguaje R.Asignación en lenguaje R

Considérese la siguiente sesión R shell:

> x <- c(5, 6, 7) 
> x[1] <- 10 
> x 
[1] 10 6 7 
> 

que entiendo totalmente. El vector (5, 6, 7) se crea y enlaza a el símbolo 'x'. Más tarde, 'x' se rebota al nuevo vector (10, 6, 7) porque los vectores son estructuras de datos inmutables.

Pero lo que sucede aquí:

> c(4, 5, 6)[1] <- 10 
Error in c(4, 5, 6)[1] <- 10 : 
    target of assignment expands to non-language object 
> 

o aquí:

> f <- function() c(4, 5, 6) 
> f()[1] <- 10 
Error in f()[1] <- 10 : invalid (NULL) left side of assignment 
> 

Me parece que sólo se puede asignar valores a las estructuras de datos con nombre (como 'x').

La razón por la que estoy preguntando es porque trato de implementar el núcleo del lenguaje R y no estoy seguro de cómo hacer frente a tales asignaciones .

Gracias de antemano

+1

Esa es una gran pregunta. Puede encontrar un poco de información en algunas de las respuestas aquí: http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this –

Respuesta

16

Me parece que solo se pueden asignar valores a las estructuras de datos con nombre (como 'x').

Eso es precisamente lo que la documentación para ?"<-" dice:

Descripción:

Assign a value to a name. 

x[1] <- 10 No usa la misma función que x <- c(5, 6, 7). El primero llama al [<-, mientras que el segundo llama al <-.

+1

Ah ok.Sin embargo, el analizador no parece variar entre x <- 2 y x [1] <- 2 porque la función 'canonical' me da ' <-' (x, 2) y '<-' (' ['(x, 1), 2) Así que creo que el intérprete despacha de alguna manera en el lvalue. –

14

usted puede hacer modificaciones a funciones anónimas, pero no hay una asignación a vectores anónimos. Incluso R crea copias temporales con nombres y a veces verá mensajes de error que reflejan ese hecho. Usted puede leer esto en el R language definition en la página 21, donde se ocupa de la evaluación de expresiones para "asignación de subconjunto" y para otras formas de asignación:

x[3:5] <- 13:15 
# The result of this commands is as if the following had been executed 
`*tmp*` <- x 
x <- "[<-"(`*tmp*`, 3:5, value=13:15) 
rm(`*tmp*`) 

y hay una advertencia de no usar *tmp* como un nombre de objeto porque se sobrescribirá durante la próxima llamada al [<-

15

Según la respuesta de @ Owen a this question, x[1] <- 10 realmente está haciendo dos cosas. Llama a la función [<- y asigna el resultado de esa llamada a x.

Así que lo que se quiere lograr el resultado es c(4, 5, 6)[1] <- 10:

> `[<-`(c(4, 5, 6),1, 10) 
[1] 10 5 6 
+0

La función '<-' es realmente una función infija que puede tomar 2+ argumentos, el primero de los cuales es _siempre_ un verdadero nombre R (no un vector de caracteres). –

Cuestiones relacionadas