R 的保留名:
强制命名的方法:
理解下面的原因:
> y <- list(x, x, x)
> lobstr::obj_size(y)
8,000,128 B
> y1 = list(x)
> lobstr::obj_size(y1)
8,000,104 B
节约内存的方法
- R 的字符串池:
- 选择表示alternative representation
技巧
用list 替代dataframe
好问题
因为向量只能存储单一类型元素,而最后的赋值语句修改了x 的类型:
> x <- c(1L, 2L, 3L)
> lobstr::ref(x)
[1:0x7fd891132788] <int>
> x[[2]] <- 3
> lobstr::ref(x)
[1:0x7fd896dd5058] <dbl>
一些函数
- make.names()
可以将非法的变量名更改为合法的:
空格, - 都会被. 替换。
make.names(c("a and b", "a-and-b"), unique = TRUE)
# "a.and.b" "a.and.b.1"
make.names(c("a and b", "a_and_b"), unique = TRUE)
# "a.and.b" "a_and_b"
make.names(c("a and b", "a_and_b"), unique = TRUE, allow_ = FALSE)
# "a.and.b" "a.and.b.1"
make.names(c("", "X"), unique = TRUE)
# "X.1" "X" currently; R up to 3.0.2 gave "X" "X.1"
- lobstr::obj_size/obj_addr
返回变量的大小与地址。
- tracemem()
可以用来追踪某一对象上的变量是否发生地址变化:
> x <- c(1, 2, 3)
> cat(tracemem(x), "\n")
<0x7fd897e8f328>
y <- x
y[[3]] <- 4L
#> tracemem[0x7fd897e8f328 -> 0x7fd895d4ff38]:
其实也就是本来y,x 都指引同一对象,由于y 的值发生修改,就会对该对象创建副本,并进行修改,将值指引给x。
如果再次修改y, R 就不会再创建副本了,而是直接修改y 的元素的值:
> lobstr::obj_addr(x)
[1] "0x7fd895d4ff38"
> x[[3]] <- 4
> lobstr::obj_addr(x)
[1] "0x7fd895d4ff38"
untracemem() is the opposite of tracemem(); it turns tracing off.
- lobstr::ref()
返回对象及其内部元素的内存地址:
> lobstr::ref(y,y1)
o [1:0x7fd896f93558] <list>
+-[2:0x7fd89809f840] <dbl>
+-[3:0x7fd89809f878] <dbl>
\-[4:0x7fd89809f8b0] <dbl>
o [5:0x7fd896eec6e8] <list>
+-[6:0x7fd897d9f088] <dbl>
+-[7:0x7fd897d9f0c0] <dbl>
\-[8:0x7fd897d9f0f8] <dbl>
- lobstr::mem_used()
返回当前使用的内存大小。