6

次の例があります。

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のインデックス列を削除したいと思います。

4

1 に答える 1

5

素晴らしい質問です。 通常のRの方法で、変更時data.table コピーされます。<-

パッケージによって、:=またはパッケージによって提供されるset*関数(setkey、、 )によって変更時にコピーされることはありません。setnamessetattrdata.table

したがって、data.tableコピーを決定するのはオブジェクト自体について特別なことではなく、とまったく同じ方法で関数に引数として渡されdata.frameます。重要なのは、関数内で行うことです。演算子は<-変更時にコピーします。これは、で使用する場合も同じdata.tableです。一方:=、オペレーターは参照により割り当てます。

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

たまたま、昨夜のLondonRトークでこれに関するスライドがありました。これは、現在ホームページのプレゼンテーションセクションの下にあります(タイトル付きのスライドを参照copy())。

于 2012-06-20T12:50:02.503 に答える