获取提供给 purrr::pmap 调用的参数

Get arguments supplied to a purrr::pmap call

我 运行 是一个有很多参数的函数,我正在探索某些参数的变化如何影响函数的输出。我正在通过 purrr::pmap 做到这一点。我想跟踪用于每个函数调用的参数:我希望函数 return 它的输出,以及所有使用的参数值的命名列表。

这是一个 MWE:

f <- function (a, b, c) a + b + c
a_values <- 1:5
effect_of_a <- pmap(list(a = a_values), f, b = 0, c = 0)

我希望effect_of_a是一个列表的列表,其中每个子列表不仅包含结果f(a,b,c),还包含使用的a、b和c的值。我可以手动编写该列表,但我有很多参数,它们可能会改变。那么有没有办法在 purrr:pmap?

发起的函数调用中捕获参数列表及其值

你可以使用 with :

pmap(list(a = a_values), ~with(list(...), list(f = f(...),args = list(...))),
          b = 0,
          c = 0)

[[1]]
[[1]]$f
[1] 1

[[1]]$args
[[1]]$args$a
[1] 1

[[1]]$args$b
[1] 0

[[1]]$args$c
[1] 0
...

这是一个通用的解决方案,其中参数被捕获在一个额外的函数 f_2 中,它是用 pmap 而不是 f 调用的:

library(purrr)
f <- function (a, b, c) a + b + c
f_2 <- function(a, b, c) {
  list(result = f(a, b, c),
       args = c(as.list(environment())))
}
a_values <- 1:3
pmap(list(a = a_values), f_2, b = 0, c = 0)
[[1]]
[[1]]$result
[1] 1

[[1]]$args
[[1]]$args$a
[1] 1

[[1]]$args$b
[1] 0

[[1]]$args$c
[1] 0



[[2]]
[[2]]$result
[1] 2

[[2]]$args
[[2]]$args$a
[1] 2

[[2]]$args$b
[1] 0

[[2]]$args$c
[1] 0



[[3]]
[[3]]$result
[1] 3

[[3]]$args
[[3]]$args$a
[1] 3

[[3]]$args$b
[1] 0

[[3]]$args$c
[1] 0

对于列表的列表,您也可以尝试类似的方法:

effect_of_a <- map(a_values %>% as.list, function(a, b = 0, c = 0) {
  list(f_eval = f(a, b, c),
       a = a, 
       b = b, 
       c = c)
})

如果 b 和 c 的值也在变化,您可以尝试:

b_values <- 2:6
c_values <- 3:7

effect_of_a <- list(a_values, b_values, c_values) %>%
  map(~.x %>% as.list) %>%
  pmap(~list(f_eval = f(..1, ..2, ..3),
             a = ..1, 
             b = ..2, 
             c = ..3))