mapply 以向量列表作为参数进行向量化
mapply with list of vectors as arguments to vectorize over
这是一个关于如何(如果可能)使用参数的命名列表(或其他非常通用的解决方案)通过 mapply() 进行矢量化的一般性问题。我试图在这里找到正确的模式,这样我就可以在许多自定义函数上使用 mapply(),而不必在 mapply() 调用中列出参数名称。一个简单的例子如下:
代码后的期望输出不使用参数列表
mapply(seq, from = 1:3, to = 3:1)
[[1]]
[1] 1 2 3
[[2]]
[1] 2
[[3]]
[1] 3 2 1
一次(失败)尝试所需的模式:
from <- 1:3
to <- 3:1
vectorized_arguments <- list(from, to)
names(vectorized_arguments) <- c("from","to")
mapply(seq, vectorized_arguments)
from to
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
[7,] 7 7
[8,] 8 8
[9,] 9 9
我们可以使用 do.call
和 Map
do.call(Map, c(f = seq, vectorized_arguments))
#[[1]]
#[1] 1 2 3
#[[2]]
#[1] 2
#[[3]]
#[1] 3 2 1
或mapply
do.call(mapply, c(FUN = seq, vectorized_arguments))
或 pmap
library(purrr)
pmap(vectorized_arguments, seq)
这是一个关于如何(如果可能)使用参数的命名列表(或其他非常通用的解决方案)通过 mapply() 进行矢量化的一般性问题。我试图在这里找到正确的模式,这样我就可以在许多自定义函数上使用 mapply(),而不必在 mapply() 调用中列出参数名称。一个简单的例子如下:
代码后的期望输出不使用参数列表
mapply(seq, from = 1:3, to = 3:1)
[[1]]
[1] 1 2 3
[[2]]
[1] 2
[[3]]
[1] 3 2 1
一次(失败)尝试所需的模式:
from <- 1:3
to <- 3:1
vectorized_arguments <- list(from, to)
names(vectorized_arguments) <- c("from","to")
mapply(seq, vectorized_arguments)
from to
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
[7,] 7 7
[8,] 8 8
[9,] 9 9
我们可以使用 do.call
和 Map
do.call(Map, c(f = seq, vectorized_arguments))
#[[1]]
#[1] 1 2 3
#[[2]]
#[1] 2
#[[3]]
#[1] 3 2 1
或mapply
do.call(mapply, c(FUN = seq, vectorized_arguments))
或 pmap
library(purrr)
pmap(vectorized_arguments, seq)