【问题标题】:Can we pass a function as an argument我们可以将函数作为参数传递吗
【发布时间】:2016-04-04 00:02:59
【问题描述】:

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

【问题讨论】:

  • 是的。请参阅 ?optim?integrate 的示例部分,了解一些接受其他函数作为参数的 R 函数。
  • 这个问题是一个绝对有效的问题,根本不是没有重点的(它包含一个问题和示例),不应关闭。已经有一个很好的答案,但鉴于它是一个复杂的主题,其他答案也可能提供有价值的信息/示例

标签: r higher-order-functions


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    randomise <- function(f) f(runif(1e3))
    
    randomise(mean)
    #> [1] 0.5059199
    randomise(mean)
    #> [1] 0.5029048
    randomise(sum)
    #> [1] 504.245
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-09
      • 2015-09-19
      • 2011-07-24
      • 2015-12-29
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多