我试图重现Advanced R中有关“复制时修改”主题的示例,并且发现即使在对象上只有一个名称的情况下,仍会创建一个副本。似乎没有就地修改的优化。
x <- c(1, 2, 3)
cat(tracemem(x), "\n")
y <- x
y[[3]] <- 4L
y[[3]] <- 5L
untracemem(x)
obj_addr(y)
这是我得到的结果:
<000001E458990360>
tracemem[0x000001e458990360 -> 0x000001e458991510]:
tracemem[0x000001e458991510 -> 0x000001e458994bd0]:
[1] "0x1e458994bd0"
我了解到,当我们第一次更改y的值y [[3]]--4L时,将会创建一个副本,因此将副本设置为tracemem [0x000001e458990360-> 0x000001e458991510]。但是,如果有第3个元素从4更改为5,并且不存在就地修改的话,则不应进行任何复制。
有什么方法可以打开就地修改优化吗?我正在使用R-3.5.3。