16 Iteration

学习使用purrr实现迭代。

library(tidyverse) 
library(microbenchmark)

16.1 一个很长的导图

16.2 导图补充

16.2.1 循环模式:名称

如果想要创建命名的输出向量,请一定按照如下方式进行命名:

results <- vector("list", length(x)) 
names(results) <- names(x)

16.3 练习

(1)It’s common to see for loops that don’t preallocate the output and instead increase the length of a vector at each step:

output <- vector("integer", 0)
for (i in seq_along(x)) {
  output <- c(output, lengths(x[[i]]))
}
output

How does this affect performance? Design and execute an experiment.

安装microbenchmark包,microbenchmark函数可以比较多个函数多次运行时间。

# 未预先分配输出空间
add_vector_1 <- function(n){
  output <- vector("integer", 0) 
  for (i in seq_len(n)) { 
    output <- c(output, i) 
  output
  } 
}
# 预先分配输出空间
add_vector_2 <- function(n){
  output <- vector("integer", n) 
  for (i in seq_len(n)) { 
    output[[i]] <- i
  output
  } 
}

# 比较运行时间
 microbenchmark(add_vector_1(10000), add_vector_2(10000), times = 10)
#> Unit: microseconds
#>                 expr   min     lq   mean median     uq    max neval
#>  add_vector_1(10000) 99278 104586 115419 107580 125863 150725    10
#>  add_vector_2(10000)   566    648   1206    890   1398   3475    10

差了两个数量级。