我正在更新以前只接受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