对多个参数进行映射
到目前为止,我们都是沿着单个输入进行映射。但通常你会遇到多个相关的输入,需要并行地迭代它们。这正是 map2() 和 pmap() 函数的职责。例如,假设你想模拟一些具有不同均值的随机正态数。你已经知道如何用 map() 来实现:
mu <- list(5, 10, -3) mu %>% map(rnorm, n = 5) %>% str() #> List of 3 #> $ : num [1:5] 5.45 5.5 5.78 6.51 3.18 #> $ : num [1:5] 10.79 9.03 10.89 10.76 10.65 #> $ : num [1:5] -3.54 -3.08 -5.01 -3.51 -2.9
如果你还想让标准差也变化呢?一种方法是对索引进行迭代,并用索引去访问均值和标准差向量:
sigma <- list(1, 5, 10) seq_along(mu) %>% map(~rnorm(5, mu[[.]], sigma[[.]])) %>% str() #> List of 3 #> $ : num [1:5] 4.94 2.57 4.37 4.12 5.29 #> $ : num [1:5] 11.72 5.32 11.46 10.24 12.22 #> $ : num [1:5] 3.68 -6.12 22.24 -7.2 10.37
但这样会掩盖代码的意图。我们可以改用 map2(),它可以并行地迭代两个向量:
map2(mu, sigma, rnorm, n = 5) %>% str() #> List of 3 #> $ : num [1:5] 4.78 5.59 4.93 4.3 4.47 #> $ : num [1:5] 10.85 10.57 6.02 8.82 15.93 #> $ : num [1:5] -1.12 7.39 -7.5 -10.09 -2.7
map2() 会生成这样一系列函数调用:
