获取提供给 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))
我 运行 是一个有很多参数的函数,我正在探索某些参数的变化如何影响函数的输出。我正在通过 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))