为什么Dataa.table通过引用更新名称(DT),即使我将其赋值给另一个变量?

为什么Dataa.table通过引用更新名称(DT),即使我将其赋值给另一个变量?

我存储了一个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] TRUEDT[ , z := runif(100)]names1# [1] "x" "y" "z"names2# [1] "x" "y"

我的问题有两个:

  1. 为什么不

    names1 <- names(DT)

    创建

    data.table

    名字?在其他情况下,我们被明确警告

    <-

    创建副本,两个

    data.table

    S和

    data.frame

    S.
  2. 有什么区别

    names1 <- names(DT)

    names2 <- c(names(DT))?


慕盖茨4494581
浏览 537回答 3
3回答

蝴蝶刀刀

这对我来说也是个新闻,很棒的问题。名称向量和列指针向量都被过度分配。什么时候:=指定一个新列,它还通过引用更新了名称向量。这可以通过不使名称向量被过度分配来改变/修正。但是,如果在循环中添加列,则会稍微慢一些。所以最好记录下nm <- copy(names(DT))是必需的,否则names(DT)返回引用。

江户川乱折腾

就像我刚刚发现的那样,我自己也开始到那里去了。.Internal(inspect())..我想我还没意识到矢量实际上,在内部可以引用data.table-我一直以为只有data.table内部可能是对data.table.
打开App,查看更多内容
随时随地看视频慕课网APP