我们可以将函数作为参数传递吗
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)
也可以使用 ...
将 foo1
或 foo2
的函数参数传递给 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
我正在使用 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)
也可以使用 ...
将 foo1
或 foo2
的函数参数传递给 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