如何将参数直接传递给从 mapply 调用的函数,或者如何将向量视为函数的参数而不是 mapply
How to pass arguments to function called from mapply directly OR how to treat vector as argument to function not to mapply
假设我有以下功能:
my.fun1 <- function(a,b,c){
a * c + b
}
如果我想用多个参数多次调用它,我可以这样做:
> my.fun1(1, 1, c(1:3))
[1] 2 3 4
> my.fun1(2, 2, c(1:3))
[1] 4 6 8
> my.fun1(3, 3, c(1:3))
[1] 6 9 12
但是如果我使用 mapply
我会得到这个:
> mapply(my.fun1, c(1:3), c(1:3), c(1:3))
[1] 2 6 12
而不是期望的:
[[1]]
[1] 2 3 4
[[2]]
[1] 4 6 8
[[3]]
[1] 6 9 12
恕我直言,问题是 mapply
基本上将函数调用转换为:
> my.fun1(1, 1, 1)
[1] 2
>
> my.fun1(2, 2, 2)
[1] 6
>
> my.fun1(3, 3, 3)
[1] 12
如何将 mapply
的最后一个参数直接传递给 my.fun1
而不是作为 mapply
的参数,而是 my.func1
?
PS:我一直在 maplpy
调用中使用匿名函数。最接近的是get(根据建议here):
> x <- mapply(function(x, y){my.fun1(x, y, c(1:3))}, c(1:3), c(1:3))
> split(x, rep(1:ncol(x), each = nrow(x)))
$`1`
[1] 2 3 4
$`2`
[1] 4 6 8
$`3`
[1] 6 9 12
但我想这是一种丑陋的方法,必须有更好的方法。
由于 my.fun1
中的最后一个输入与 vector
相同,我们将其放在 list
中并将其作为参数传递给 Map
或 mapply
.
Map(my.fun1, 1:3, 1:3, list(1:3))
或者如@baptiste 所述,可以使用 MoreArgs
传递常量
Map(my.fun1, 1:3, 1:3, MoreArgs = list(c=1:3))
当我们使用 mapply
时,最好使用 SIMPLIFY=FALSE
以避免将 list
强制转换为 matrix
(如果 list
元素相同
mapply(my.fun1, 1:3, 1:3, list(1:3), SIMPLIFY=FALSE)
假设我有以下功能:
my.fun1 <- function(a,b,c){
a * c + b
}
如果我想用多个参数多次调用它,我可以这样做:
> my.fun1(1, 1, c(1:3))
[1] 2 3 4
> my.fun1(2, 2, c(1:3))
[1] 4 6 8
> my.fun1(3, 3, c(1:3))
[1] 6 9 12
但是如果我使用 mapply
我会得到这个:
> mapply(my.fun1, c(1:3), c(1:3), c(1:3))
[1] 2 6 12
而不是期望的:
[[1]]
[1] 2 3 4
[[2]]
[1] 4 6 8
[[3]]
[1] 6 9 12
恕我直言,问题是 mapply
基本上将函数调用转换为:
> my.fun1(1, 1, 1)
[1] 2
>
> my.fun1(2, 2, 2)
[1] 6
>
> my.fun1(3, 3, 3)
[1] 12
如何将 mapply
的最后一个参数直接传递给 my.fun1
而不是作为 mapply
的参数,而是 my.func1
?
PS:我一直在 maplpy
调用中使用匿名函数。最接近的是get(根据建议here):
> x <- mapply(function(x, y){my.fun1(x, y, c(1:3))}, c(1:3), c(1:3))
> split(x, rep(1:ncol(x), each = nrow(x)))
$`1`
[1] 2 3 4
$`2`
[1] 4 6 8
$`3`
[1] 6 9 12
但我想这是一种丑陋的方法,必须有更好的方法。
由于 my.fun1
中的最后一个输入与 vector
相同,我们将其放在 list
中并将其作为参数传递给 Map
或 mapply
.
Map(my.fun1, 1:3, 1:3, list(1:3))
或者如@baptiste 所述,可以使用 MoreArgs
Map(my.fun1, 1:3, 1:3, MoreArgs = list(c=1:3))
当我们使用 mapply
时,最好使用 SIMPLIFY=FALSE
以避免将 list
强制转换为 matrix
(如果 list
元素相同
mapply(my.fun1, 1:3, 1:3, list(1:3), SIMPLIFY=FALSE)