使用公式(而不是函数)指定 map2() 的选项

Specifying options to map2() using a formula (rather than a function)

例如我正在尝试使用 purrr::map2() 在向量上迭代 rnorm() 并且我想指定选项 nsd 但不是 mean

使用 "formula" 方式,我可以这样做:

len <- c(1, 3, 10); sigma <- c(1, 1, 10)
set.seed(123)
map2(len, sigma, ~rnorm(n = .x, sd = .y))

但是是否可以指定 nsd 而无需指定 mean "function" 怎么办?如果我执行以下操作,它会为 mean 填充 "sigma" 因为 mean 是 rnorm() 中 [=25 之后的下一个选项=]n。

set.seed(123)
map2(len, sigma, rnorm) 

我可以指定 mean 为 0,这样 "sigma" 将应用于 sd,如下所示:

set.seed(123)
map2(len, sigma, rnorm, mean = 0) 

但是如果我想将 mean 保留为默认值(不指定)并且仍然将 "sigma" 应用于 sd[=38 怎么办? =]?如,如果我使用 "function" 方法,是否有办法执行类似 .x/.y 的操作。

抱歉,太啰嗦了。非常感谢!

否,因为您必须手动将数据定向到第一个[s]以外的参数。这是base R的优点之一Map,它可以采用命名参数进行迭代:

library(purrr)

len <- c(1, 3, 10) 
sigma <- c(1, 1, 10)

set.seed(123)
map2(len, sigma, ~rnorm(n = .x, sd = .y)) %>% str()
#> List of 3
#>  $ : num -0.56
#>  $ : num [1:3] -0.2302 1.5587 0.0705
#>  $ : num [1:10] 1.29 17.15 4.61 -12.65 -6.87 ...

set.seed(123)
Map(rnorm, n = len, sd = sigma) %>% str()
#> List of 3
#>  $ : num -0.56
#>  $ : num [1:3] -0.2302 1.5587 0.0705
#>  $ : num [1:10] 1.29 17.15 4.61 -12.65 -6.87 ...

你不能在 map2 中做同样的事情,因为输入参数被命名为 .x.y,而 Map 吞噬了 ....

除了使用 Map 之外,另一种选择是使用 pmap。不过,这需要您在列表中输入内容。

set.seed(123)
a <- map2(len, sigma, ~rnorm(n = .x, sd = .y))

set.seed(123)
input <- list(n = len, sd = sigma)
b <- pmap(input, rnorm)

identical(a, b)
# [1] TRUE