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.

2 comentarios sobre “x[] <- lapply(...)

  1. Iñaki 30 enero, 2020 19:29

    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.

Comenta

Your email address will not be published.

Puedes usar estas etiquetas y atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.