2014-03-29 25 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