R 在函数中使用setDT
我正在编写一个函数,其中包括将输入强制转换为data.tableR 在函数中使用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
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)