R 使用特殊的紧凑存储来存储序列。当您更改第一个条目时,它会退回到标准存储。
对于像1:3 这样的短序列,特殊存储实际上低效,但对于1:3000000,大小将相同:
rm(list = ls())
library(lobstr)
x <- 1:3
y <- x
x[1] <- 4L
obj_size(x)
#> 64 B
obj_size(y)
#> 680 B
x <- 1:3000000
y <- x
x[1] <- 4L
obj_size(x)
#> 12,000,048 B
obj_size(y)
#> 680 B
由reprex package (v0.3.0) 于 2020 年 12 月 26 日创建
在 R 中定义对象的大小也相当困难。例如,长度为 3(或 300 万)的序列占用 680 字节,但其中两个不占用两倍:
x <- 1:3
obj_size(x)
#> 680 B
y <- 1:3000000
obj_size(y)
#> 680 B
z <- list(x, y)
obj_size(z)
#> 896 B
由reprex package (v0.3.0) 于 2020 年 12 月 26 日创建
z 的大小将包含list() 容器以及绑定到x 和y 的两个对象的大小,但它仍然只比它们各自大216 字节。这是因为x 和y 的一些大小是共享的:它们都是同一种特殊对象,所以处理它的代码只存储一次。