R 在函数中使用setDT

R 在函数中使用setDT,r,data.table,R,Data.table,我正在编写一个函数,其中包括将输入强制转换为data.table library(data.table) df <- data.frame(id = 1:10) f <- function(df){setDT(df)} f(df) df[, temp := 1] 似乎我可以在函数f中使用df做其他事情 df1 <- data.frame(id = 1:10) f <- function(df){ eval(substitute(setDT(df)),pare

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

library(data.table)
df <- data.frame(id = 1:10)
f <- function(df){setDT(df)}
f(df)
df[, temp := 1]
似乎我可以在函数
f
中使用df做其他事情

df1 <- data.frame(id = 1:10)
f <- function(df){
      eval(substitute(setDT(df)),parent.frame())
      df[, temp := 1]
      }
f(df1)

df1好问题!警告信息应该是:。。。并通过将整张表的副本改为。。。。我会解决这个问题的

setDT
做两件事:

  • data.frame
    /
    list
  • 使用
    alloc.col
    过度分配列(以便可以直接使用
    :=
如果输入不是
数据表,则第二步需要浅拷贝。这就是为什么我们要在符号的环境(setDT的父帧)中将该值赋还给符号。但是
setDT
的父帧是函数
f()
。因此,函数中的
setDT(df)
已顺利完成,但驻留在全局环境中的
df
将只更改其类,而不是过度分配(因为浅拷贝切断了链接)

在下一步中,
:=
再次检测和浅拷贝以进行过度分配

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


非常感谢

谢谢。无论如何,在使用函数之前要求用户使用setDT是有意义的,至少在我的例子中是这样。因此,
data.table
能够通过引用添加列的方法是分配一个较长的列表,然后将列添加到较长的列表中?@iShouldUseAName,它过度分配,是的。查看(以及那里的链接)以获得更详细的说明。
df1 <- data.frame(id = 1:10)
f <- function(df){
      eval(substitute(setDT(df)),parent.frame())
      df[, temp := 1]
      }
f(df1)