我们可以将函数作为参数传递吗

Can we pass a function as an argument

我正在使用 R 构建数学模型。我想写一个函数 f(a, b, g) 接受 3 个参数,最后一个是一个函数。我想知道我可以将一个函数作为参数传递给另一个函数吗?如果可以的话,你们能举个简单的例子吗?

向函数传递函数参数当然是合法的。许多基本的 R 函数都是这样做的。例如,

tapply(..., FUN)

您可以通过?tapply查看它们。

事实是,您只将函数名称视为符号。例如,在下面的玩具示例中:

foo1 <- function () print("this is function foo1!")
foo2 <- function () print("this is function foo2!")

test <- function (FUN) {
  if (!is.function(FUN)) stop("argument FUN is not a function!")
  FUN()
  }

## let's have a go!
test(FUN = foo1)
test(FUN = foo2)

也可以使用 ...foo1foo2 的函数参数传递给 test。我把这个留给你做一些研究。


如果你熟悉C语言,那么就不难理解为什么这是合法的。 R 是用 C 编写的(虽然它的语言语法属于 S 语言),所以本质上这是通过使用指向函数的指针来实现的。如果您想了解更多信息,请参阅 How do function pointers in C work?

这是来自 Hadley's text 的一个非常简单的例子:

randomise <- function(f) f(runif(1e3))

randomise(mean)
#> [1] 0.5059199
randomise(mean)
#> [1] 0.5029048
randomise(sum)
#> [1] 504.245