R语言,我们可以传递函数作为参数

时间:2016-04-04 00:03:00

标签: r higher-order-functions

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

2 个答案:

答案 0 :(得分:7)

将函数传递给函数参数当然是合法的。许多基本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)

还可以使用foo1foo2test的函数参数传递给...。我留下这个给你做一些研究。

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

答案 1 :(得分:0)

这是Hadley's text中一个非常简单的示例:

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

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