r - {purrr}: ¿cómo reemplazar un bucle simple con `purrr::map()` mientras se utilizan todos los argumentos de una función?

CorePress2024-01-24  10

Hola a todos, he leído el archivo de ayuda y algunas preguntas sobre el tema aquí, pero no pude encontrar una respuesta. Creo que es una pregunta muy simple, por lo que probablemente me esté perdiendo algo obvio.

Me gustaría reemplazar una implementación de bucle for tan básica, como

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

con purrr::map(), mientras se utilizan todos los argumentos de la función (aquí: rnorm())

Lo siguiente no funciona y devuelve un error de argumento no utilizado.

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

Se ejecuta lo siguiente, pero map pasó los argumentos 1:10 a rnorm(sd = .x), por lo que el resultado no es el esperado.

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

¿Existe una manera sencilla de lograrlo?

Agradezco su tiempo y atención.



------------------------------------

Puedes hacer esto con el bucle for y/o el mapa, pero creo que se trata más bien de un problema de replicación o purrr::rerun.

En base R:

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

O usando ronroneo:

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



------------------------------------

Hay dos maneras de hacer esto. La primera es una función anónima y la segunda es una fórmula. Consulte los ejemplos en ?map() para obtener más información.

Función anónima

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

Fórmula

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

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare