【发布时间】:2022-01-07 20:44:28
【问题描述】:
当我再次加载 data.table 时,我将 data.table 保存为 qs 文件,它的行为似乎不像 data.table。
澄清我的意思。这是一个例子:
library(data.table)
library(qs)
n <- 10000
dt <- data.table(x = rnorm(n), y = rnorm(n))
cnames <- colnames(dt)
dt[, new_col_1 := 1]
cnames
[1] "x" "y" "new_col_1"
cnames <- colnames(dt)
dt[, new_col_2 := 1]
cnames
[1] "x" "y" "new_col_1" "new_col_2"
所以函数colnames() 是指向data.table dt 的列名的指针。
但是,如果我对保存和加载的 data.table 执行相同操作,就会发生这种情况
n <- 10000
dt <- data.table(x = rnorm(n), y = rnorm(n))
qs::qsave(dt, "dt_saved.qs")
dt_saved <- qs::qread("dt_saved.qs")
cnames <- colnames(dt_saved)
dt_saved[, new_col_1 := 1]
cnames
[1] "x" "y"
cnames <- colnames(dt_saved)
dt_saved[, new_col_2 := 1]
cnames
[1] "x" "y" "new_col_1" "new_col_2"
所以只有在修改data.table之后,函数colnames()才是一个指针。
一些额外的信息:
R version 4.1.1 (2021-08-10)
qs_0.25.1
data.table_1.14.2
【问题讨论】:
-
当然它仍然有 data.table 类,否则它不会允许
:=所以我认为它与加载数据后不存在/有效的 internal.selfref 有关。因此,您将 colnames 分配给 cnames,但还没有将其更新到的参考。当你分配一个新列时, internal.selfref 被设置,所以它知道从那时起 colnames 中的下一个新列。
标签: r data.table