{purrr}:如何在用完函数的所有参数时用 `purrr::map()` 替换简单循环?

{purrr}: how to replace a simple loop with `purrr::map()` while using up all arguments of a function?

大家好,我已经阅读了帮助文件和很多关于此处主题的问题,但找不到 答案。我认为这是一个非常简单的问题,所以我可能遗漏了一些明显的东西。

我想替换这样一个基本的for loop实现,比如

lst <- list()
for (i in 1:10) {
  lst[[i]] <- rnorm(n = 3, mean = 5, sd = 3)
}
lst

with purrr::map(),同时用完函数的所有参数(此处:rnorm()

以下内容无效,returns 出现 unused argument 错误。

1:10 %>%
  map(rnorm, n = 3, mean = 5, sd = 3)
# Error in .f(.x[[i]], ...) : unused argument (.x[[i]])

下面的运行,但是map把参数1:10传给了rnorm(sd = .x),所以 结果与预期不同。

library(purrr)
1:3 %>% 
  map(rnorm, n = 3, mean = 5)
#> [[1]]
#> [1] 5.133702 6.456135 5.041438
#> 
#> [[2]]
#> [1] 5.722486 4.614772 2.640809
#> 
#> [[3]]
#> [1] 1.445749 5.826666 6.096497

有没有简单的方法可以实现?

感谢您的时间和关注。

有两种方法可以做到这一点。第一个是匿名函数,第二个是公式。有关详细信息,请参阅 ?map() 中的示例。

  1. 匿名函数

    library(purrr)
    1:10 %>%
      map(function(x) rnorm(n = 3, mean = 5, sd = 3))
    
  2. 公式

    1:10 %>%
      map(~ rnorm(n = 3, mean = 5, sd = 3))
    

您可以使用 for 循环 and/or map 来做到这一点,但我认为这更多是 replicatepurrr::rerun 问题。

在基数 R 中:

replicate(10, rnorm(n = 3, mean = 5, sd = 3), simplify = FALSE)

或使用 purrr :

purrr::rerun(10, rnorm(n = 3, mean = 5, sd = 3))