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 <- xy[[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()
返回当前使用的内存大小。

