1

我了解“function(x)”的工作原理,但“function()”在这里的作用是什么?

z <- function() {
  y <- 2
  function(x) {
    x + y
  }
}
4

3 回答 3

5

function是一个关键字,它是函数创建的一部分(在Gilles 在他的回答中描述的编程意义上)。其他部分是参数列表(在括号中)和函数体(在大括号中)。

在您的示例中,z是一个不带参数的函数。它返回一个带有 1 个参数(名为 )的函数x(因为默认情况下 R 返回最后一个评估的语句作为返回值)。该函数返回其参数x加 2。

z被调用(不带参数z():)时,它会将 2 分配给y(在函数变量范围内,这是一个我不会涉及的附加概念)。然后它创建一个函数(没有名称),它接受一个名为 的参数x,当它自己被调用时,它返回它的参数x加 2。该匿名函数从调用返回,z并且可能被存储,以便以后可以调用它.

有关将函数作为对象传递的更多讨论,请参见https://github.com/hadley/devtools/wiki/Functionshttps://github.com/hadley/devtools/wiki/Functionals 。

于 2013-02-14T21:12:57.933 回答
3

“函数”这个词在数学编程中的含义有些不同。在数学中,函数是参数的每个可能值与结果之间的对应关系。在编程中,函数是从参数计算结果的指令序列。

在数学中,没有参数的函数是常数。在编程中,情况并非如此,因为函数可能有副作用,比如打印一些东西。所以你会在程序中遇到很多没有参数的函数。

Hre 函数function(x) { x + y }取决于变量y。没有副作用,所以这个函数很像 $f(x) = x + y$ 定义的数学函数。然而,这个定义只对给定的值是完整的y。前面的指令设置y为 2,所以

function() {
  y <- 2
  function(x) {
    x + y
  }
}

相当于

function () {
  function(x) {
    x + 2
  }
}

从某种意义上说,当两个定义应用于相同的值时,会产生相同的结果。然而,它们的计算方式略有不同。

该函数被命名为z。当你调用z(没有参数,所以你写z())时,这会构建函数function (x) { x + 2 },或等效的东西:z()是一个参数的函数,它的参数加 2。所以你可以写出类似的东西z()(3)——结果是 5。

这显然是一个玩具示例。随着您在讲座中的进步,您将看到越来越复杂的示例,其中此类功能构建与其他功能混合以实现有用的东西。

于 2013-02-14T21:24:17.707 回答
1

一些帮助下,我挑选了一些没有正式参数的函数示例,以帮助您理解它们为什么有用。

有副作用的函数

  • plot.new()例如,初始化图形设备。
  • 想要更新控制台缓冲区? flush.console()支持你。

用途狭窄的功能

这可能是大多数情况。

  • 想知道日期/时间?打电话date()
  • 想知道 R 的版本吗?打电话getRversion()
于 2013-02-15T15:47:30.770 回答