La diferencia en assignment operators es más clara cuando las usa para establecer un valor de argumento en una llamada de función. Por ejemplo:
median(x = 1:10)
x
## Error: object 'x' not found
En este caso, x
se declara dentro del alcance de la función, por lo que no existe en el espacio de trabajo del usuario.
median(x <- 1:10)
x
## [1] 1 2 3 4 5 6 7 8 9 10
En este caso, x
se declara en el espacio de trabajo del usuario, para que pueda usarlo después de la llamada a la función se ha completado.
Hay una preferencia general entre la comunidad de R para el uso de <-
para la asignación (aparte de en las firmas de función) para la compatibilidad con (muy) viejas versiones de S-Plus. Tenga en cuenta que los espacios ayudan a aclarar situaciones como
x<-3
# Does this mean assignment?
x <- 3
# Or less than?
x < -3
más R IDE tienen atajos de teclado para hacer <-
más fácil de escribir. Ctrl + = en Arquitecto, Alt + - en rstudio (Opción + - bajo MacOS), Shift + - (subrayado) en emacs + ESS.
Si prefiere escribir =
a <-
pero desea utilizar el símbolo de asignación más común para el código publicado públicamente (en CRAN, por ejemplo), entonces se puede utilizar una de las tidy_*
funciones en el paquete formatR
de forma automática reemplace =
con <-
.
library(formatR)
tidy_source(text = "x=1:5", arrow = TRUE)
## x <- 1:5
La respuesta a la pregunta "¿Por qué x <- y = 5
Lanza un error, pero no x <- y <- 5
?" es "depende de la magia contenida en el analizador". La sintaxis de R contiene many ambiguous cases que deben resolverse de una forma u otra.El analizador elige resolver los bits de la expresión en diferentes órdenes dependiendo de si se utilizó =
o <-
.
Para comprender lo que está sucediendo, debe saber que la asignación devuelve silenciosamente el valor asignado. Puede ver eso más claramente al imprimir explícitamente, por ejemplo print(x <- 2 + 3)
.
En segundo lugar, es más claro si usamos la notación de prefijo para la asignación. Así
x <- 5
`<-`(x, 5) #same thing
y = 5
`=`(y, 5) #also the same thing
El analizador interpreta como x <- y <- 5
`<-`(x, `<-`(y, 5))
Podríamos esperar que x <- y = 5
sería entonces
`<-`(x, `=`(y, 5))
pero en realidad se pone interpretarse como
`=`(`<-`(x, y), 5)
Esto se debe a que =
tiene una prioridad menor que <-
, como se muestra en la página de ayuda ?Syntax
.
Como se indicó [aquí] (http://blog.revolutionanalytics.com/2008/12/use-equals-or-arrow-for-assignment.html) los orígenes del '<-' el símbolo proviene de los viejos teclados APL que en realidad tenían una sola tecla '<-' en ellos. – joran