understand object and its name
- More accurately predict the performance and memory usage of your code.
- Write faster code by avoiding accidental copies, a major source of slow code.
- Better understand R’s functional programming tools.
```r
x <- c(1, 2, 3)
以上面的代码为例,这个代码坐了什么事情?
他创建了一个对象叫做X,这个对象包含了1,2,3
实际上她应该是坐了两件事,他创建了一个对象,c(1,2,3),然后把这个对象命名为了x
<br />以上面的图片为例
如果是数据框修改<br /><br />这表明列修改,只会修改某一列<br /><br />如果修改的是行,则每一行都会修改
<a name="qZHMg"></a>
## 对象的大小
列表的元素是对值的引用,因此列表的大小可能比您预期的要小得多:
```r
x <- runif(1e6)
obj_size(x)
#> 8,000,048 B
y <- list(x, x, x)
obj_size(y)
#> 8,000,128 B
## y仅比X大 80 字节,x这是一个包含三个元素的空列表的大小
obj_size(list(NULL, NULL, NULL))
#> 80 B
由于 R 使用全局字符串池,字符向量占用的内存比您预期的要少:重复一个字符串 100 次并不会使它占用 100 倍的内存。
banana <- "bananas bananas bananas"
obj_size(banana)
#> 136 B
obj_size(rep(banana, 100))
#> 928 B
R 不是存储序列中的每个数字,而是存储第一个和最后一个数字。这意味着每个序列,无论有多大,都是相同的大小
obj_size(1:3)
#> 680 B
obj_size(1:1e3)
#> 680 B
obj_size(1:1e6)
#> 680 B
obj_size(1:1e9)
#> 680 B
就地修改
修改 R 对象通常会创建一个副本。有两个例外:
- 具有单个绑定的对象获得了特殊的性能优化。
- 环境,一种特殊类型的对象,总是在原地修改。 ```r v <- c(1, 2, 3)
v[[3]] <- 4
<br />可见v还是绑定于0x207
这里有个for 循环速度的问题:不太懂
```r
x <- data.frame(matrix(runif(5 * 1e4), ncol = 5))
medians <- vapply(x, median, numeric(1))
for (i in seq_along(medians)) {
x[[i]] <- x[[i]] - medians[[i]]
}
#> tracemem[0x7f80c429e020 -> 0x7f80c0c144d8]:
#> tracemem[0x7f80c0c144d8 -> 0x7f80c0c14540]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c14540 -> 0x7f80c0c145a8]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c145a8 -> 0x7f80c0c14610]:
#> tracemem[0x7f80c0c14610 -> 0x7f80c0c14678]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c14678 -> 0x7f80c0c146e0]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c146e0 -> 0x7f80c0c14748]:
#> tracemem[0x7f80c0c14748 -> 0x7f80c0c147b0]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c147b0 -> 0x7f80c0c14818]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c14818 -> 0x7f80c0c14880]:
#> tracemem[0x7f80c0c14880 -> 0x7f80c0c148e8]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c148e8 -> 0x7f80c0c14950]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c14950 -> 0x7f80c0c149b8]:
#> tracemem[0x7f80c0c149b8 -> 0x7f80c0c14a20]: [[<-.data.frame [[<-
#> tracemem[0x7f80c0c14a20 -> 0x7f80c0c14a88]: [[<-.data.frame [[<-
# 如果像上诉一样循环速度很慢
y <- as.list(x)
cat(tracemem(y), "\n")
#> <0x7f80c5c3de20>
for (i in 1:5) {
y[[i]] <- y[[i]] - medians[[i]]
}
#> tracemem[0x7f80c5c3de20 -> 0x7f80c48de210]:
#但如果这样循环,速度是很快的
???why