x[] <- lapply(...)

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.