2012-06-20 10 views
5

ho il seguente esempio:Eliminazione di colonne di un data.table all'interno di una funzione di

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 

Con mia grande sorpresa, la colonna di indice esiste ancora dopo il richiamo della funzione mod() . Questo non è il caso quando cancello la riga dat <- dat[2:10]. Immagino che, poiché le righe non possono essere cancellate ancora per riferimento, viene creato un altro data.table. Tuttavia, vorrei eliminare la colonna dell'indice nel file 01.originale.

+0

Si prega di non iniziare il titolo con "R:"; questo è ciò che i tag sono per. –

+0

+1 ha urtato il 100% nello stesso problema oggi. – Beasterfield

risposta

5

Ottima domanda. data.tableè copiato su cambio, da <-, nel solito modo R.

Non viene copiato contro cambiamento := o le funzioni set* (setkey, setnames, setattr) forniti dal pacchetto data.table.

Quindi non è niente di speciale nell'oggetto data.table che decide di copiare o meno, e viene passato come argomento per funzionare esattamente allo stesso modo di data.frame. È ciò che fai su di esso all'interno della funzione che conta. L'operatore <- copia-on-change e questo non è diverso quando utilizzato su un data.table. L'operatore :=, d'altra parte, assegna per riferimento.

Come dici tu, non c'è (ancora) modo per eliminare righe per riferimento, quindi fino ad allora dovrai utilizzare la sintassi R standard per assegnare la copia al simbolo nel campo di chiamata.

Si è verificato uno slittamento al talk di LondonR ieri sera che è ora nello homepage nella sezione di presentazione (vedere la diapositiva con il titolo copy()).

+1

Grazie! Userò davvero la copia. –

Problemi correlati