Estos días he aprendido una expresión muy compacta para operar sobre las columnas de una tabla en R:
x <- iris # por ejemplo x[] <- lapply(x, function(x) factor(x)) # o cualquier otra función
Aunque lapply
debería devolver (y, de hecho, devuelve) una lista, esos corchetes de x
fuerzan de una manera contraintuitiva que la salida final sea una tabla.
La magia es consecuencia de que [<-
es una función en sí misma (puedes consultar help("[<-")
si quieres) con un comportamiento que es el que es (porque sí, a veces las cosas son simplemente como son).
La razón, que no la justificación, de por qué es así está en la definición de esa función, pero
`[<-`
devuelve
.Primitive("[<-")
y no estoy para encontrar el if
por el que se resuelve la expresión anterior en el código fuente de R. El resultado, en cualquier caso, es el anunciado y no otro. Y la expresión, aunque, de nuevo, contraintuitiva, no deja de ser útil.
El comportamiento es coherente con cómo funciona el subsetting en R.
x[,y]
tiene missing el primer argumento, lo que implica la selección de todas las filas.x[y,]
tiene missing el segundo argumento, lo que implica la selección de todas las columnas.x[]
tiene missing ambos, lo que implica la selección de todo el data frame. La variante[<-
simplemente modifica esa selección. En todos los casos, modificas un subset de un data frame (incluso cuando ese subset implica todo), y el resultado es un data frame de las mismas dimensiones, ni más ni menos.Así visto, tiene toda la lógica del mundo, sí.