2012-06-20 13 views
5

Mam następujący przykład:Usuwanie kolumny data.table wewnątrz funkcji

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 

Ku mojemu zaskoczeniu, kolumna indeksu wciąż istnieje po wywołaniu funkcji mod() . Nie dzieje się tak, gdy usuwam linię dat <- dat[2:10]. Domyślam się, że ponieważ wiersze nie mogą być usunięte przez odniesienie jeszcze, tworzony jest inny data.table. Chciałbym jednak usunąć kolumnę indeksu w oryginalnym pliku data.table.

+0

Proszę nie rozpoczynać tytułu od "R:"; do tego służą znaczniki. –

+0

+1 trafił dziś w 100% w ten sam problem. – Beasterfield

Odpowiedz

5

Świetne pytanie. data.tablejest skopiowana na zmianę, przez <-, w zwykły sposób R.

To nie jest kopiowany na zmianę przez := lub set* funkcji (setkey, setnames, setattr) dostarczanych przez pakiet data.table.

Nie jest więc niczym specjalnym obiekt, który decyduje o kopiach lub nie, i jest przekazywany jako argument do funkcji w dokładnie taki sam sposób jak data.frame. To, co robisz na tym wewnątrz funkcji, która się liczy. Operator <- kopiuje na zmianę i nie różni się, gdy jest używany na data.table. Z drugiej strony operator := przypisuje jako odniesienie.

Tak jak mówisz, nie ma sposobu (jeszcze) na usunięcie wierszy przez odniesienie, więc do tego czasu będziesz musiał użyć standardowej składni R, aby przypisać kopię z powrotem do symbolu w zakresie wywoływania.

Tak się złożyło, że na ostatniej rozmowie LondonR pojawił się slajd, który znajduje się teraz pod numerem homepage w sekcji prezentacji (patrz slajd z tytułem copy()).

+1

Dzięki! Użyję rzeczywiście kopii. –