R 的保留名:

2. 标示符和值 - 图1

强制命名的方法:

2. 标示符和值 - 图2

理解下面的原因:

  1. > y <- list(x, x, x)
  2. > lobstr::obj_size(y)
  3. 8,000,128 B
  4. > y1 = list(x)
  5. > lobstr::obj_size(y1)
  6. 8,000,104 B

节约内存的方法

  • R 的字符串池:

2. 标示符和值 - 图3

2. 标示符和值 - 图4

  • 选择表示alternative representation

2. 标示符和值 - 图5

技巧

用list 替代dataframe

2. 标示符和值 - 图6

好问题

2. 标示符和值 - 图7

因为向量只能存储单一类型元素,而最后的赋值语句修改了x 的类型:

  1. > x <- c(1L, 2L, 3L)
  2. > lobstr::ref(x)
  3. [1:0x7fd891132788] <int>
  4. > x[[2]] <- 3
  5. > lobstr::ref(x)
  6. [1:0x7fd896dd5058] <dbl>

一些函数

  • make.names()

可以将非法的变量名更改为合法的:

空格, - 都会被. 替换。

  1. make.names(c("a and b", "a-and-b"), unique = TRUE)
  2. # "a.and.b" "a.and.b.1"
  3. make.names(c("a and b", "a_and_b"), unique = TRUE)
  4. # "a.and.b" "a_and_b"
  5. make.names(c("a and b", "a_and_b"), unique = TRUE, allow_ = FALSE)
  6. # "a.and.b" "a.and.b.1"
  7. make.names(c("", "X"), unique = TRUE)
  8. # "X.1" "X" currently; R up to 3.0.2 gave "X" "X.1"
  • lobstr::obj_size/obj_addr

返回变量的大小与地址。

  • tracemem()

可以用来追踪某一对象上的变量是否发生地址变化:

  1. > x <- c(1, 2, 3)
  2. > cat(tracemem(x), "\n")
  3. <0x7fd897e8f328>
  4. y <- x
  5. y[[3]] <- 4L
  6. #> tracemem[0x7fd897e8f328 -> 0x7fd895d4ff38]:

其实也就是本来y,x 都指引同一对象,由于y 的值发生修改,就会对该对象创建副本,并进行修改,将值指引给x。

如果再次修改y, R 就不会再创建副本了,而是直接修改y 的元素的值:

  1. > lobstr::obj_addr(x)
  2. [1] "0x7fd895d4ff38"
  3. > x[[3]] <- 4
  4. > lobstr::obj_addr(x)
  5. [1] "0x7fd895d4ff38"

untracemem() is the opposite of tracemem(); it turns tracing off.

  • lobstr::ref()

返回对象及其内部元素的内存地址:

  1. > lobstr::ref(y,y1)
  2. o [1:0x7fd896f93558] <list>
  3. +-[2:0x7fd89809f840] <dbl>
  4. +-[3:0x7fd89809f878] <dbl>
  5. \-[4:0x7fd89809f8b0] <dbl>
  6. o [5:0x7fd896eec6e8] <list>
  7. +-[6:0x7fd897d9f088] <dbl>
  8. +-[7:0x7fd897d9f0c0] <dbl>
  9. \-[8:0x7fd897d9f0f8] <dbl>
  • lobstr::mem_used()

返回当前使用的内存大小。

2. 标示符和值 - 图8