2012-06-20 21 views
5

内data.tableの列を削除:驚いたことには、私は次の例持つ機能

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 

を、インデックス列はまだmod() 関数を呼び出した後に存在します。 dat <- dat[2:10]行を削除しても、このようなことはありません。 行はまだ参照で削除できないので、別の data.tableが作成されていると思います。 ただし、元の data.tableのインデックス列を削除したいと思います。

+0

タイトルは「R:」で始まらないでください。それはタグのためのものです。 –

+0

+1は今日同じ問題で100%ぶつかった。 – Beasterfield

答えて

5

大きな質問です。 data.table<-によってコピーされ、通常のR方法でコピーされます。

これはコピー・オン・チェンジされていないdata.tableパッケージによって提供:=又はset*機能(setkeysetnamessetattr)によって。

data.tableオブジェクト自体がコピーを決定するかどうかは特別なことではなく、data.frameとまったく同じ方法で関数の引数として渡されます。それは、あなたが数える関数の中でそれを行うことです。 <-オペレータのコピーオン・チェンジは、data.tableで使用しても変わりません。一方、:=オペレータは、参照によって割り当てます。

あなたは、(まだ)参照によって行を削除する方法はないので、標準のR構文を使用して呼び出し元のスコープのシンボルにコピーを戻す必要があります。

昨晩のLondonRの講演でスライドがありましたが、プレゼンテーションセクションのhomepageにあります(スライドタイトルcopy()を参照)。

+1

ありがとう!私は確かにコピーを使用します。 –

関連する問題