将函数名称作为参数传递给mapply?

Rob*_*ald 4 r mapply

我想在mapply中将函数名称作为参数传递:

f2 <- function(a, b) a + b^2
f <- function(a, b, func) func(a, b)
f(1, 3, f2)  ## returns 10
mapply(f2,  1:2,  3)  ## returns [1] 10 11
mapply(function(a, b) f(a, b, f2), 1:2,  3) ## returns [1] 10 11
mapply(f,  1:2,  3,  f2)  ## fails
Run Code Online (Sandbox Code Playgroud)

最后一次mapply调用会产生错误

Error in dots[[3L]][[1L]] : object of type 'closure' is not subsettable

有什么办法吗?

MrF*_*ick 5

mapply假设您要遍历在第一个函数之后传递的所有向量。但是您想f2为每个迭代使用相同的值。您可以使用MoreArgs=参数来做到这一点

mapply(f,  1:2,  3,  MoreArgs=list(func=f2))
Run Code Online (Sandbox Code Playgroud)

您不会对3遇到相同的问题,因为R将执行向量循环以扩展3 c(3,3)以匹配与相同的长度c(1,2)。R中的函数没有相同的隐式回收行为。但是,如果您希望该值始终保持不变,则最好将其放在MoreArgs参数中