【问题标题】:{purrr}: how to replace a simple loop with `purrr::map()` while using up all arguments of a function?{purrr}:如何在用完函数的所有参数时用 purrr::map() 替换一个简单的循环?
【发布时间】:2021-03-26 22:26:02
【问题描述】:

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

我想替换这样一个基本的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

有没有一种简单的方法可以做到这一点?

感谢您的时间和关注。

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    您可以使用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))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 2022-01-23
        • 2019-12-20
        相关资源
        最近更新 更多