2012-06-20 5 views
5

tengo el siguiente ejemplo:Eliminación de columnas de una data.table dentro de una función

irisDT <- as.data.table(iris) 

mod <- function(dat) { 
    dat[, index:=(1:nrow(dat))] 
    setkey(dat, index) 

    dat <- dat[2:10] 

    dat[, index:=NULL] 
    invisible() 
} 

mod(irisDT) 
names(irisDT) # it contains index 

Para mi sorpresa, la columna de índice sigue existiendo después de llamar a la función mod() . Este no es el caso cuando elimino la línea dat <- dat[2:10]. Supongo que, dado que las filas no se pueden eliminar por referencia aún, se crea otra data.table. Sin embargo, me gustaría eliminar la columna de índice en la tabla de datos original.

+0

No comience su título con "R:"; para eso están las etiquetas. –

+0

+1 golpeó 100% en el mismo problema hoy. – Beasterfield

Respuesta

5

Gran pregunta. data.tablees copiado en el cambio, por <-, en la forma R habitual.

No se copia-al-cambiar por := o las funciones (set*setkey, setnames, setattr) proporcionados por el paquete data.table.

Así que no tiene nada de especial el objeto data.table que decide si las copias se copian o no, y se pasa como argumento para las funciones exactamente de la misma manera que data.frame. Es lo que haces dentro de la función que cuenta. El operador <- copia-en-cambio y eso no es diferente cuando se usa en un data.table. El operador :=, por otro lado, asigna por referencia.

Como dices, no hay manera (todavía) de eliminar filas por referencia, por lo que hasta entonces necesitarás usar la sintaxis estándar R para volver a asignar la copia al símbolo en el alcance de la llamada.

Ocurre que hubo una diapositiva en la charla de LondonR de la noche anterior que ahora está en el homepage en la sección de presentación (ver diapositiva con el título copy()).

+1

¡Gracias! Usaré copia de hecho. –

Cuestiones relacionadas