我正在更新以前只接受data.frame
对象与data.table
参数一起使用的一组函数。当函数返回一个data.table时是否进行复制?
我决定使用R的方法调度来实现函数,以便使用data.frame
的旧代码仍然可以与更新的函数一起工作。在我的一个功能中,我输入data.frame
作为输入,修改它,然后返回修改后的data.frame
。我也创建了data.table
实现。例如:
# The functions
foo <- function(d) {
UseMethod("foo")
}
foo.data.frame <- function(d) {
<Do Something>
return(d)
}
foo.data.table <- function(d) {
<Do Something>
return(d)
}
我知道data.table
作品进行修改,而不复制,我实现了foo.data.table
同时保持这一点。但是,我在函数结尾处返回data.table
对象,因为我希望我的旧脚本能够与新的data.table
对象一起使用。这是否会制作data.table
的副本?我该如何检查?根据文件,必须非常明确地创建一个data.table
的副本,但我不确定在这种情况下。
我想要回东西的时候,我没有与data.tables
原因:
我的老段子是这样的
someData <- read.table(...)
...
someData <- foo(someData)
我想脚本能够通过与data.table
s到运行只是改变数据摄取线。换句话说,我希望脚本能够通过将someData <- read.table(...)
更改为someData <- fread(...)
来工作。
只有':='和'set *'函数通过引用修改'data.table'。因此,如果您在函数中使用':='或任何'set *'函数,如果您不想通过引用修改'd',则可能需要处理'copy(d)' 。例如:如果你这样做:'ans < - d [,lapply(.SD,sum),by = cols]',那么这里的引用并没有改变。 – Arun
@阿伦抱歉,如果我的问题不清楚。我确实希望通过引用修改'd',所以我确实使用了':='和'set *'函数来修改'foo.data.table'函数中的'data.table'。如果我通过引用在函数内修改'd',那么'return(d)'返回'd'的副本吗? – ialm
不,它不..你可以使用'tracemem'来检查这些东西。例如:'foo < - function(x){x [,bar:= 1L]; return(x)}; x = data.table(a = 1:5,b = 6:10); tracemem(X); FOO(X)'。如果有任何复制,它会在'foo(x)'后产生一些详细信息。或者,你可以使用'address()'函数来测试'x'的列在函数前后是否具有相同的地址。如果是,则不进行复制。 – Arun