r-{purrr}:如何用"purrr::map()"替换简单循环,同时用完函数的所有参数



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

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

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

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

以下操作不起作用,并返回一个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

有没有一种简单的方法可以实现这一点?

我感谢您的时间和关注

您可以使用for循环和/或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))

有两种方法可以做到这一点。第一个是匿名函数,第二个是公式。有关更多信息,请参阅?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))
    

最新更新