gpt4 book ai didi

r - 当函数返回一个 data.table 时是否进行了复制?

转载 作者:行者123 更新时间:2023-12-04 14:28:07 24 4
gpt4 key购买 nike

我正在更新一组以前只接受 data.frame 的函数使用的对象 data.table论据。

我决定使用 R 的方法 dispatch 来实现该功能,以便旧代码使用 data.frame s 仍可使用更新后的函数。在我的一个函数中,我接受了 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(...) .

最佳答案

感谢 Arun 在评论中的回答。我将在他的评论中使用他的例子来回答这个问题。

可以使用 tracemem 检查是否正在制作副本。在 R 中跟踪对象的函数。来自该函数的帮助文件,?tracemem ,描述说:

This function marks an object so that a message is printed whenever the internal code copies the object. It is a major cause of hard-to-predict memory use in R.



例如:
# Using a data.frame
df <- data.frame(x=1:5, y=6:10)
tracemem(df)
## [1] "<0x32618220>"
df$y[2L] <- 11L
## tracemem[0x32618220 -> 0x32661a98]:
## tracemem[0x32661a98 -> 0x32661b08]: $<-.data.frame $<-
## tracemem[0x32661b08 -> 0x32661268]: $<-.data.frame $<-
df
## x y
## 1 1 6
## 2 2 11
## 3 3 8
## 4 4 9
## 5 5 10

# Using a data.table
dt <- data.table(x=1:5, y=6:10)
tracemem(dt)
## [1] "<0x5fdab40>"
set(dt, i=2L, j=2L, value=11L) # No memory output!
address(dt) # Verify the address in memory is the same
## [1] "0x5fdab40"
dt
## x y
## 1: 1 6
## 2: 2 11
## 3: 3 8
## 4: 4 9
## 5: 5 10

看来 data.frame更改 data.frame 中的一个元素时,对象会被复制两次, 而 data.table就地修改,无需复制!

根据我的问题,我可以跟踪 data.tabledata.frame对象, d , 在将其传递给函数之前, foo , 检查是否有任何副本。

关于r - 当函数返回一个 data.table 时是否进行了复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22793796/

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