2016-08-09 6 views
0

私のワークフローでは、作業のいくつかの側面を他のコピーで行い、その後に参加する前に、メインのdata.frame/data.tableのコピーを作成することがよくありますに。しかし、私はしばしばこれらのコピーがまだ互いに接続されていることを経験します。 1で行われた編集もother.Unfortunatelyで行われているので、私はそれを複製し、それは次のようになります私のコンソールから、貼り付けをコピーすることはできませんよ。data.tablesの接続されたコピー

だから、コピーに対して行わ変化があることを
# 'used3' is a copy of 'used' with some altercations to it 
c("nLocs","nDays") %in% names(used) 
[1] FALSE FALSE 
> used3[, nDays :=uniqueN(yDay),c("ID","Year","Season")] 
> used3[, nLocs :=.N,c("ID","Year","Season")] 
> c("nLocs","nDays") %in% names(used) 
[1] TRUE TRUE 

すべてがオリジナルで行われました。これはバグですか?私は彼らにも似たような名前をつけていますか...それとも何ですか?

R-バージョン:3.3 data.tableバージョン:1.9.6

しかし、また、あなたがdata.frameと、この動作が表示されないはずですRとdata.table

+0

'?data.table :: copy'を見てください – jbaums

+0

ありがとう!それは、「どうして私はそれを見逃しましたか?私はそれを受け入れることができるように答えとして追加する必要がありますか? –

+0

[this](http://stackoverflow.com/questions/10225098/understanding-exactly-when-a-data-table-is-a-reference-to-vs-a-copy-of-another)およびリンクされた質問。また、[これ](http://stackoverflow.com/questions/15913417/why-does-data-table-update-namesdt-by-reference-even-if-i-assign-to-another-v/15913648#15913648 ) –

答えて

1

両方の古いバージョンでは経験したが、あなたはdata.tableオブジェクトのためにそれを見るでしょう。 (すなわち、要素を

library(data.table) 
A <- data.table(x=1:10) 
B <- A 
A[, y:=10:1] 

B 
##  x y 
## 1: 1 10 
## 2: 2 9 
## 3: 3 8 
## 4: 4 7 
## 5: 5 6 
## 6: 6 5 
## 7: 7 4 
## 8: 8 3 
## 9: 9 2 
## 10: 10 1 

AB依然として同一である:

?data.table::copyはdata.tablesが可能な限りコピーを作成防止、及び結果のような、set*data.table又は:=オペレータを変更した後ことであると説明しますyを両方に加えた)。

一番下の行はdata.tableのコピーを作成することで、あなたが代わりに行うことができます:data.tableに要素を追加する$演算子を使用して結果ではないこと

A <- data.table(x=1:10) 
B <- copy(A) 
A[, y:=10:1] 

B 
##  x 
## 1: 1 
## 2: 2 
## 3: 3 
## 4: 4 
## 5: 5 
## 6: 6 
## 7: 7 
## 8: 8 
## 9: 9 
## 10: 10 

注意コピーが作成されました:

A <- data.table(x=1:10) 
B <- A 
A$y <- 10:1 

B 
##  x 
## 1: 1 
## 2: 2 
## 3: 3 
## 4: 4 
## 5: 5 
## 6: 6 
## 7: 7 
## 8: 8 
## 9: 9 
## 10: 10 
関連する問題