2014-03-29 24 views
1

我我遇到一個奇怪的「錯誤」(假設它是不顯山露水記錄。)如果你保存到一個字符向量data.table的名稱,然後從刪除列data.table中,名稱的字符向量會自動更新。我覺得這很奇怪和違反直覺。這是一個錯誤?如果不是,它的基本原理是什麼?data.table名稱特徵向量是一個參考

編輯:我問是否不是更好地返回當前名稱的COPY,而不是引用,這是一個錯誤傾向性,並更好地保留的情況下,當有真正的性能優勢(如核心數據)。

> library(data.table) 
data.table 1.8.8 For help type: help("data.table") 
> sessionInfo() 
R version 2.15.3 (2013-03-01) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=C     LC_NAME=C     LC_ADDRESS=C 
[10] LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base 

other attached packages: 
[1] data.table_1.8.8 
> dt = data.table(a = 1:10, b = 1:10) 
> cols = names(dt) 
> cols 
[1] "a" "b" 
> dt[, a := NULL] 
> cols 
[1] "b" 
> 
+0

而你問的問題是......? – A5C1D2H2I1M1N2O1R2T1

+0

這是一個錯誤? – vc273

+0

看起來更像是一個功能,雖然我不一定會預料到它。似乎相當有幫助的是,列在進行「溝通」並在刪除列時得到更新。 –

回答

2

您可以「複製」變量的名稱。

library(data.table) 
dt = data.table(a = 1:10, b = 1:10) 
cols = copy(names(dt)) 
cols 
dt[, a := NULL] 
cols 
+2

比整個表更好地複製名稱:'copy(names(dt))' – Jthorpe

2

當你定義cols,你是綁定到dt:=分配操作員正在編輯dt,因此cols被相應地更改。 R用戶通常不會處理這個問題,因爲大多數代碼重新定義變量(重新綁定它)爲一個新值,而不是編輯退出的對象。例如,請參閱下面的代碼。

但是,正如@IShouldBuyABoat指出,這是一種功能,而不是一個錯誤。實際上,很多語言都很典型。

> library(data.table) 
> dt = data.table(a = 1:10, b = 1:10) 
> dt 
    a b 
1: 1 1 
2: 2 2 
3: 3 3 
4: 4 4 
5: 5 5 
6: 6 6 
7: 7 7 
8: 8 8 
9: 9 9 
10: 10 10 
> cols = names(dt) 
> cols 
[1] "a" "b" 
> dt = data.table(b = 1:10) 
> dt 
    b 
1: 1 
2: 2 
3: 3 
4: 4 
5: 5 
6: 6 
7: 7 
8: 8 
9: 9 
10: 10 
> cols 
[1] "a" "b" 
+1

所以它是一個功能! –

+0

我的想法是它應該返回當前名稱的副本而不是參考,除非這樣做有很大的性能提升(就像核心數據一樣)。例如,如果您確實dim(dt)是副本,並且您確實使用了dim.dt = dim(dt),然後從dt中刪除了一列,則dim.dt將不會更新。這導致不一致。 – vc273