{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()
中的示例。
匿名函数
library(purrr)
1:10 %>%
map(function(x) rnorm(n = 3, mean = 5, sd = 3))
公式
1:10 %>%
map(~ rnorm(n = 3, mean = 5, sd = 3))
您可以使用 for
循环 and/or map
来做到这一点,但我认为这更多是 replicate
或 purrr::rerun
问题。
在基数 R 中:
replicate(10, rnorm(n = 3, mean = 5, sd = 3), simplify = FALSE)
或使用 purrr
:
purrr::rerun(10, rnorm(n = 3, mean = 5, sd = 3))
大家好,我已经阅读了帮助文件和很多关于此处主题的问题,但找不到 答案。我认为这是一个非常简单的问题,所以我可能遗漏了一些明显的东西。
我想替换这样一个基本的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()
中的示例。
匿名函数
library(purrr) 1:10 %>% map(function(x) rnorm(n = 3, mean = 5, sd = 3))
公式
1:10 %>% map(~ rnorm(n = 3, mean = 5, sd = 3))
您可以使用 for
循环 and/or map
来做到这一点,但我认为这更多是 replicate
或 purrr::rerun
问题。
在基数 R 中:
replicate(10, rnorm(n = 3, mean = 5, sd = 3), simplify = FALSE)
或使用 purrr
:
purrr::rerun(10, rnorm(n = 3, mean = 5, sd = 3))