length - ¿Por qué se permite:=como operador de infijo?
title seo length (2)
Me he topado con el popular paquete data.table
y una cosa en particular me intrigó. Tiene un operador de asignación en el lugar
: =
Esto no está definido en la base R. De hecho, si no cargó el paquete data.table
, habría generado un error si hubiera intentado usarlo (por ejemplo, a := 2
) con el mensaje:
Error: no se pudo encontrar la función
":="
Además, ¿por qué :=
funciona? ¿Por qué R te permite definir :=
como operador de infijo mientras que todas las demás funciones de infijo tienen que estar rodeadas por %%
, por ejemplo,
`:=` <- function(a, b) {
paste(a,b)
}
"abc" := "def"
Claramente, no pretende ser una sintaxis alternativa a %function.name%
para definir funciones de infijo. ¿ data.table
explota algunas peculiaridades del análisis de R? ¿Es un hack? ¿Será "remendado" en el futuro?
Es algo que el analizador R base reconoce y parece analizar como una asignación a la izquierda (al menos en términos u orden de operaciones y similares). Ver el código fuente de C para más detalles.
as.list(parse(text="a:=3")[[1]])
# [[1]]
# `:=`
#
# [[2]]
# a
#
# [[3]]
# [1] 3
Por lo que puedo decir, está sin documentar (en lo que respecta a la base R). Pero es una función / operador que puede cambiar el comportamiento de
`:=`<-function(a,b) {a+b}
3 := 7
# [1] 10
Como puede ver, realmente no hay nada especial en la parte ":" en sí. Simplemente sucede que es el comienzo de un token compuesto.
No es solo un operador de dos puntos, sino que :=
es un solo operador formado por los dos puntos y el signo igual (al igual que la combinación de "<" y "-" forma el operador de asignación en la base R). El operador :=
es una función de infijo que se define como parte de la evaluación del argumento "j" dentro de la función [.data.table
. Crea o asigna un valor a una columna designada por su argumento LHS usando el resultado de evaluar su RHS.