data.table名称字符向量是一个参考

时间:2014-03-29 16:49:27

标签: r data.table

我遇到一个奇怪的“bug”(假设它没有记录在某处。)如果你在一个字符向量中存储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"
>

2 个答案:

答案 0 :(得分:2)

你可以"复制"变量的名称。

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

答案 1 :(得分:2)

当您定义cols时,您将其绑定到dt:=分配操作员正在修改dt,因此cols会相应更改。 R用户通常不会处理此问题,因为大多数代码将变量(重新绑定)重新定义为新值,而不是编辑现有对象。例如,请参阅下面的代码。

但是,如@IShouldBuyABoat所述,它是一个功能,而不是一个bug。实际上,在许多语言中非常典型。

> 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"