の名前を として保存しまし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)
コピーを作成しないのはなぜですか? 他の例では、 s とs の両方のコピーを作成するdata.table
ことが明示的に警告されます。<-
data.table
data.frame
names1 <- names(DT)
とはどう違いnames2 <- c(names(DT))
ますか?