Я сохранил имена 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.frames. - В чем разница между
names1 <- names(DT)иnames2 <- c(names(DT))?