Я сохранил имена 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"
Мой вопрос в 2 раза:
- Почему
names1 <- names(DT)
не создает копию именdata.table
? В других случаях мы явно предупреждаем, что<-
создает копии, какdata.table
, так иdata.frame
s. - В чем разница между
names1 <- names(DT)
иnames2 <- c(names(DT))
?