tag length r data.table colon-equals

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.