【发布时间】:2018-11-03 06:31:18
【问题描述】:
我已将data.table 的名称存储为vector:
library(data.table)
set.seed(42)
DT <- data.table(x = runif(100), y = runif(100))
names1 <- names(DT)
据我所知,这是一个普通的字符向量:
str(names1)
# chr [1:2] "x" "y"
class(names1)
# [1] "character"
dput(names1)
# c("x", "y")
但是,这不是普通的字符向量。这是一个神奇的字符向量!当我向我的data.table 添加新列时,此向量会更新!
DT[ , z := runif(100)]
names1
# [1] "x" "y" "z"
我知道这与 := 如何通过分配更新有关,但这对我来说仍然很神奇,因为我希望 <- 能够复制 data.table'的名字。
我可以通过将名称包装在 c() 中来解决此问题:
library(data.table)
set.seed(42)
DT <- data.table(x = runif(100), y = runif(100))
names1 <- names(DT)
names2 <- c(names(DT))
all.equal(names1, names2)
# [1] TRUE
DT[ , z := runif(100)]
names1
# [1] "x" "y" "z"
names2
# [1] "x" "y"
我的问题有两个:
- 为什么
names1 <- names(DT)不创建data.table名称的副本?在其他情况下,我们明确警告<-创建了data.tables 和data.frames 的副本。 -
names1 <- names(DT)和names2 <- c(names(DT))有什么区别?
【问题讨论】:
-
好问题!跟进 Arun 的回答,我已提交 #2675 以记录需要
nm <- copy(names(DT))。感谢您的强调,我以前没有意识到这一点。
标签: r data.table