【问题标题】:R programming functionsR 编程函数
【发布时间】:2017-04-19 05:02:21
【问题描述】:

我正在学习 R 编程。我无法理解函数中的函数在 R 中是如何工作的。示例:

f <- function(y) {
    function()  { y }
}

f()
f(2)()

我不明白为什么 $f() 不起作用并显示以下消息:

function()  { y }
<environment: 0x0000000015e8d470>

但是当我使用 $f(4)() 时,它会显示答案为 4。 请简要说明您的答案,以便我理解。

【问题讨论】:

  • 你定义了内部函数而不调用它或存储它,所以它被返回了;你已经创建了一个函数,该函数可以生成函数。要调用内部函数,请将其括在括号中,并在后面加上一个额外的集合:f &lt;- function(y) { (function() { y })() } 尽管这相当于f &lt;- function(y){y}

标签: r function functional-programming


【解决方案1】:

对于更一般的情况,让我们稍微改变一下“内部”函数:

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

现在f(2) 返回一个将 2 添加到其参数的函数。 2 的值保存在函数的环境中:

> f(2)
function(x)  { y + x}
<environment: 0x0000000015a690f0>

> environment(f(2))$y
[1] 2

.. 如果你真的想改变它,但为此你需要为f() 的输出分配一个名称:

> g <- f(2)
> environment(g)$y
[1] 2
> environment(g)$y <- 3
> g(1)
[1] 4

为什么你需要g?因为否则,使用f(2) 创建的环境会立即被垃圾回收,因此无法访问它:

> environment(f(2))$y<-4
Error in environment(f(2))$y <- 4 : 
  target of assignment expands to non-language object

当您只使用一次 f(2) 时,这不会影响大小写:

> f(2)(3)
[1] 5

【讨论】:

    【解决方案2】:

    原因是内部函数只是通过f()来表现外部儿子的答案,结果是一个函数。最好的方法是调用它 double f(3)(),因为内部函数不带任何参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多