假设我有以下功能:
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
但我想这是一种丑陋的方法,必须有更好的方法。
答案 0 :(得分:3)
由于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)