如何将参数传递给直接从mapply调用的函数或者如何将vector作为参数来处理函数而不是mapply

时间:2016-04-05 08:59:24

标签: r 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

但我想这是一种丑陋的方法,必须有更好的方法。

1 个答案:

答案 0 :(得分:3)

由于my.fun1中的最后一个输入与vector相同,我们会将其放在list中,并将其作为Mapmapply的参数传递。

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)