gpt4 book ai didi

r - 在函数内使用 setDT

转载 作者:行者123 更新时间:2023-12-03 23:35:29 25 4
gpt4 key购买 nike

我正在编写一个函数,其中包括将输入强制转换为 data.table。

library(data.table)
df <- data.frame(id = 1:10)
f <- function(df){setDT(df)}
f(df)
df[, temp := 1]

但是,最后一个命令输出以下警告:

Warning message: In [.data.table(df, , :=(temp, 1)) : Invalid .internal.selfref detected and fixed by taking a copy of the whole table so that := can add this new column by reference. At an earlier point, this data.table has been copied by R (or been created manually using structure() or similar). Avoid key<-, names<- and attr<- which in R currently (and oddly) may copy the whole data.table. Use set* syntax instead to avoid copying: ?set, ?setnames and ?setattr. Also, in R<=v3.0.2, list(DT1,DT2) copied the entire DT1 and DT2 (R's list() used to copy named objects); please upgrade to R>v3.0.2 if that is biting. If this message doesn't help, please report to datatable-help so the root cause can be fixed.



我正在使用 v1.9.3 的 data.table 和 R 3.1.1。是不是意思 df在某个时候被复制?如何避免这个警告?

编辑: setDT的代码实际上使用 NSE。所以这似乎有效:
df1 <- data.frame(id = 1:10)
f <- function(df){eval(substitute(setDT(df)),parent.frame())}
f(df1)
df1[, temp := 1]

看来我可以在函数 f 中用 df 做其他事情喜欢
df1 <- data.frame(id = 1:10)
f <- function(df){
eval(substitute(setDT(df)),parent.frame())
df[, temp := 1]
}
f(df1)

这是正确的方法吗?

最佳答案

好问题!警告消息应该说: ... 并通过获取 来修复浅整个表的副本......将解决这个问题。
setDT做两件事:

  • 将类设置为 data.table来自 data.frame/list
  • 使用 alloc.col过度分配列(以便 := 可以直接使用)

  • 如果输入不是 data.table,则第 2 步需要浅拷贝。已经。这就是为什么我们将值分配回其环境中的符号(setDT 的父框架)。但是 setDT 的父框架是你的职能 f() .因此 setDT(df)在你的函数中已经顺利通过了,但是 df驻留在全局环境中的只会改变它的类,而不是过度分配(因为浅拷贝切断了链接)。

    在下一步中, :=再次检测到并浅拷贝以过度分配。

    到目前为止的想法是使用 setDT在将其提供给函数之前转换为 data.tables。但我希望这些案件得到解决(会看一看)。

    谢谢一堆!

    关于r - 在函数内使用 setDT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26069219/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com