English · PDF 359
请注意,每次调用都会变化的参数放在函数之前;每次调用都相同的参数放在之后。
与 map() 一样,map2() 只是 for 循环的一个封装:
map2 <- function(x, y, f, ...) { out <- vector("list", length(x)) for (i in seq_along(x)) { out[[i]] <- f(x[[i]], y[[i]], ...) } out }
你还可以想象 map3()、map4()、map5()、map6() 等等,但那样很快就会变得繁琐。因此,purrr 提供了 pmap(),它接受一个参数列表。如果你想同时改变均值、标准差和样本数量,就可以使用它:
n <- list(1, 3, 5) args1 <- list(n, mu, sigma) args1 %>% pmap(rnorm) %>% str() #> List of 3 #> $ : num 4.55 #> $ : num [1:3] 13.4 18.8 13.2 #> $ : num [1:5] 0.685 10.801 -11.671 21.363 -2.562
结果如下所示:

如果你不为 list 的元素命名,pmap() 在调用函数时将使用位置匹配。这有点脆弱,并且会让代码更难阅读,所以最好为参数命名:
args2 <- list(mean = mu, sd = sigma, n = n) args2 %>% pmap(rnorm) %>% str()