我遇到一个奇怪的“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"
>
答案 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"