programming - ¿Por qué hay dos operadores de asignación, `<-` y`-> `en R?
r language history (4)
Sé cómo usar <-
y ->
, y hay several writeups sobre la diferencia entre asignación de asignación y asignación de flecha, pero no sé cuándo preferir ->
sobre <-
.
Parece que la comunidad se ha unido usando <-
para asignación.
Ni la guía de estilo de Google R ni la guía de estilo R de Hadley Wickam siquiera mencionan ->
en la sección de tareas.
Tengo curiosidad sobre las consideraciones de diseño que llevaron a los desarrolladores de S / S-PLUS a poner en el operador de asignación de flecha a la derecha ->
. ¿En qué configuración (es) usar ->
se considera más legible (o más fácil de escribir) frente a <-
o =
?
No estoy familiarizado con ningún otro lenguaje que permita la semántica de asignación correcta. ¿Qué idiomas inspiraron a R en este sentido?
Estoy buscando respuestas que citan libros / documentos de diseño inicial / manuales de usuario / listas de correo archivadas u otras referencias para establecer cuál fue la intención del autor / diseñador de S al colocar el operador de asignación de flecha hacia delante.
Creo que es solo una cuestión de preferencia personal.
Aunque ->
tuberías de magrittr predatadas, un caso de uso reciente es que ->
se puede usar para mantener el flujo de izquierda a derecha en tales tuberías:
library(magrittr)
input %>% fun1 %>% fun2 -> result
Por otro lado, dado que <-
se usa principalmente, es posible que desee usar <-
incluso en ese caso.
El argumento para <-
es que inicia la línea con el valor establecido, que es algo así como el propósito de la declaración, particularmente si la variable de resultado está bien nombrada, mientras que el lado derecho es la mecánica y también lo es el subordinado de detalle al resultado, y a uno le gusta comenzar con una visión general y luego solo entrar en los detalles más adelante. A continuación estamos definiendo el parámetro k
. Que es 3 o si está definido por una constante como está aquí o una expresión compleja parece incidental al propósito de la declaración.
k <- 3
Personalmente, nunca uso ->
.
De la respuesta a un ejercicio en The New S Language (Becker, Chambers y Wilks 1988), a través de Google Books:
Cuando escribe una expresión larga solo para recordar al final que sería una buena idea guardar el resultado, una flecha hacia la derecha le permite realizar una tarea sin volver a escribir la línea.
Esto sugiere que los usuarios S estaban trabajando directamente en la consola, sin capacidades de edición de línea que están disponibles en la mayoría de los entornos REPL / interactivos modernos ...
Algo de arqueología: busqué fuentes fundamentales en Google Books. Hay tres libros relevantes:
- el Libro Marrón: S: Un entorno interactivo para análisis de datos y gráficos RA Becker, JM Chambers (CRC Press, 1984)
- Extendiendo el Sistema S , Becker y Chambers (Taylor y Francis, 1985)
el Libro Azul: The New S Language Becker, Chambers y Wilks (Wadsworth y Brooks / Cole 1988, pero reeditado en 2018. por CRC Press)
- El Libro Marrón no menciona
->
en el texto principal:
- El Libro Marrón no menciona
pero lo hace en el apéndice:
- Extendiendo las menciones del Sistema S
->
en el texto principal:
No puedo buscar mucho del libro, así que ->
también podría ser mencionado en algún lugar del apéndice.
- El Libro azul se refiere a la flecha hacia la derecha, pero en realidad parece tener un error tipográfico:
Interpreto los pasajes rojos subrayados como de apoyo que hay un error tipográfico en la primera línea subrayada, que debería ser ->
lugar de ← ...
Aquí está la captura de pantalla de la respuesta al ejercicio mencionada anteriormente:
Si desea una copia del libro de 1985, puede obtenerlo por $ 34.41 - o $ 1070.99 (¡pero con envío gratis!) ...
No puedo especular sobre las razones de R para permitir la asignación de izquierda a derecha. Y es cierto que la mayoría de los lenguajes de programación (casi todos, de hecho) solo realizan tareas de derecha a izquierda.
Dicho esto, R no está completamente solo.
No estoy familiarizado con ningún otro lenguaje que permita la semántica de asignación correcta.
Puedo pensar en al menos otros tres (familias de) idiomas que lo permitan:
Los idiomas de ensamblaje a menudo realizan asignaciones de izquierda a derecha; por ejemplo, la influyente sintaxis de AT & T escribe una tarea como esta:
movl $1, %eax
Esto asigna el valor
1
al registro EAX. (Por otro lado, la sintaxis x86 de Intel realiza una asignación de derecha a izquierda).La operación STO ("tienda") de TI-BASIC está escrita así:
1→A
COBOL usa múltiples formas de asignación de izquierda a derecha:
MOVE 1 TO x ADD 2 TO x
etc.
Sin embargo, dudo si alguno de estos idiomas sirvió de inspiración para la sintaxis de asignación de R. Por el contrario, el lenguaje de programación APL utiliza la asignación de flechas, y generalmente se acepta que S (y por lo tanto indirectamente R) se inspiró en eso ; pero APL solo realiza la asignación de derecha a izquierda ( var ← value
).
R tiene la intención de tener una sintaxis que es bastante natural para expresar las matemáticas. Es interesante observar que ->
realidad es una notación común al describir algunas operaciones de filas elementales en matrices. Por ejemplo, s*R_i -> R_i
se usaría para denotar la operación de reemplazar la fila i por s veces la fila i. Algo como 2*A[1,] -> A[1,]
es perfectamente válido R. No sé si estas consideraciones tuvieron algo que ver con la decisión de diseño, pero muestra que es una opción razonable para un lenguaje matemático.