为什么用单元素列表对列表列进行更改会导致深层副本?

时间:2019-02-22 14:33:38

标签: r deep-copy mutate tibble

我没有意识到使用dplyr::mutate()创建一个具有单个元素列表的新列表列实际上是深度复制该元素以填充小标题长度(请参见t3)。这是为什么?

如果我显式指定正确的长度(t4)或在创建小标题(t5)时传递正确的长度,则元素将通过引用传递。

请考虑以下情况,其中列表将带有大向量的小标题围起来。

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

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

0 个答案:

没有答案