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

Pass function name as argument in 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

最后的 mapply 调用产生错误

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

有什么办法吗?

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

mapply(f,  1:2,  3,  MoreArgs=list(func=f2))

你不会遇到与 3 相同的问题,因为 R 将执行向量回收以将 3 扩展为 c(3,3) 以匹配与 c(1,2) 相同的长度。 R 中的函数没有相同的隐式回收行为。但是如果你想让这个值一直保持不变,最好放在MoreArgs参数里

1) 将函数包装在列表中:

mapply(f,  1:2,  3,  list(f2))
## [1] 10 11

2) 通常具有函数参数的函数使用 match.fun 以便可以传递函数或包含其名称的字符串。例如,mapply 本身就是这样做的,所以上面的代码行同样可以写成:mapply("f", 1:2, 3, list(f2))。如果 f 这样写,那么我们可以简单地将 f2 的名称指定为字符串,即 "f2" .

f <- function(a, b, func) {
  func <- match.fun(func)
  func(a, b)
}

mapply(f,  1:2,  3,  "f2")
## [1] 10 11