在函数体内进行修改时,为什么tracemem显示两个副本?

时间:2019-08-15 22:09:52

标签: r function copy

在R REPL内:

R version 3.6.1 (2019-07-05) -- "Action of the Toes"
> foo <- function (x) x[[1]] <- 0
> a <- 1L:3L
> tracemem(a)
[1] "<0x55d5470e4940>"
> foo(a)
tracemem[0x55d5470e4940 -> 0x55d545e11808]: foo 
tracemem[0x55d545e11808 -> 0x55d5470050c8]: foo

我不明白为什么有两份,什么时候出现。

1 个答案:

答案 0 :(得分:0)

基于joran评论:

双精度副本与函数调用无关,但这是由于整数向量转换为双精度向量b[[1]] <- 0引起的。没有功能调用的情况相同:

> a <- 1L:3L
> tracemem(a)
[1] "<0x556c48022f70>"
> b <- a
> b[[1]] <- 0
tracemem[0x556c48022f70 -> 0x556c46e1e788]: 
tracemem[0x556c46e1e788 -> 0x556c48012118]: 

现在是b[[1]] <- 0L

> a <- 1L:3L
> tracemem(a)
[1] "<0x556c480f3100>"
> b <- a
> b[[1]] <- 0L
tracemem[0x556c480f3100 -> 0x556c46e1e908]: 
>