为什么从 Map 返回时 data.table 会被复制
Why does data.table get copied when returned from Map
我了解到 data.table
从函数返回时不会被复制。但是,在这种特殊情况下,它确实会被复制。有人能解释一下为什么吗?
dt1 <- data.table(a=1)
dt2 <- data.table(b=1)
dt3 <- data.table(c=1)
address(dt1); address(dt2); address(dt3)
[1] "000000005E20D990"
[1] "00000000052301E8"
[1] "000000001D622210"
l <- list(a=dt1, b=dt2, c=dt3)
address(l$a); address(l$b); address(l$c)
$[1] "000000005E20D990"
$[1] "00000000052301E8"
$[1] "000000001D622210"
f <- function(dt) {setnames(dt, toupper(names(dt)))}
l <- Map(f, l)
address(l$a); address(l$b); address(l$c)
$[1] "000000001945C7B0"
$[1] "0000000066858738"
$[1] "000000001B021038"
dt1
$ A
: 1
dt2
$ B
: 1
dt3
$ C
: 1
所以是最后一行进行复制。但是,以下不进行复制。
address(dt1)
$[1] "000000005E20D990"
dt4 <- f(dt1)
address(dt4)
$[1] "000000005E20D990"
我错过了什么?
更新
正如大家指出的那样,map
或 mapply
正在复制。 lapply
在上述情况下有效,但我的实际代码需要函数中的多个输入。我的理解是所有 apply
函数都使用相同的代码。但似乎并非如此。
正如大家所指出的,Map
或mapply
正在复制。
我了解到 data.table
从函数返回时不会被复制。但是,在这种特殊情况下,它确实会被复制。有人能解释一下为什么吗?
dt1 <- data.table(a=1)
dt2 <- data.table(b=1)
dt3 <- data.table(c=1)
address(dt1); address(dt2); address(dt3)
[1] "000000005E20D990"
[1] "00000000052301E8"
[1] "000000001D622210"
l <- list(a=dt1, b=dt2, c=dt3)
address(l$a); address(l$b); address(l$c)
$[1] "000000005E20D990"
$[1] "00000000052301E8"
$[1] "000000001D622210"
f <- function(dt) {setnames(dt, toupper(names(dt)))}
l <- Map(f, l)
address(l$a); address(l$b); address(l$c)
$[1] "000000001945C7B0"
$[1] "0000000066858738"
$[1] "000000001B021038"
dt1
$ A
: 1
dt2
$ B
: 1
dt3
$ C
: 1
所以是最后一行进行复制。但是,以下不进行复制。
address(dt1)
$[1] "000000005E20D990"
dt4 <- f(dt1)
address(dt4)
$[1] "000000005E20D990"
我错过了什么?
更新
正如大家指出的那样,map
或 mapply
正在复制。 lapply
在上述情况下有效,但我的实际代码需要函数中的多个输入。我的理解是所有 apply
函数都使用相同的代码。但似乎并非如此。
正如大家所指出的,Map
或mapply
正在复制。