为什么使用单元素列表改变列表列会导致深层复制?

mjk*_*tfw 7 r deep-copy mutate tibble

我不知道创建一个dplyr::mutate()带有单元素列表的新列表列实际上是深度复制元素以填充tibble长度(请参阅参考资料t3).这是为什么?

如果我t4在创建tibble(t5)时指定了explicit()的正确长度或传递它,则元素将通过引用传递.

考虑以下情况,其中列表包含具有大向量的tibble.

library(tidyverse)
library(pryr)

t1 <- tibble(a = 1:4)
t2 <- tibble(b = 1:1e6)
t3 <- mutate(t1, tl = list(t2))
t4 <- mutate(t1, tl = rep(list(t2), n()))
t5 <- tibble(a = 1:4, tl = list(t2))

object_size(t2)
#> 4 MB
object_size(t3)
#> 16 MB
object_size(t4)
#> 4 MB
object_size(t5)
#> 4 MB
Run Code Online (Sandbox Code Playgroud)

reprex包创建于2019-02-22 (v0.2.1)