在 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
我想在 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