【问题标题】:function call within a function in R [duplicate]R中的函数内的函数调用[重复]
【发布时间】:2015-02-17 00:04:02
【问题描述】:

这是 Hadley 最新著作 (Advanced R) 中的一个示例。我希望他不介意我发布它。

我很难理解为什么这段代码 sn-p 会这样做。 有人可以对此进行扩展吗?我怎样才能把它分成小步骤?

add <- function(x) {

    function(y) x+y
}

adders <- lapply(1:10,add)

我理解对“添加”函数的更简单调用。

> add(2)(1)

[1] 3

在某种程度上,2 分配给 x,1 分配给 y。

当我们将此函数与 lapply 一起使用时(这种方式),如何为 y 赋值?

【问题讨论】:

  • 嗯,这很奇怪——加法器中的所有 10 个函数都是相同的:function(y) 10+y。试试sapply(adders,function(z) `z`(1)) 不过,这似乎不是你的问题;我什至不知道你的问题是什么意思。 y 在您的lapply 调用中没有分配一个值。你的函数返回一个函数。
  • 这被哈德利解释为“懒惰评估”的案例:github.com/hadley/adv-r/blob/master/…

标签: r function lazy-evaluation


【解决方案1】:

这和你最初想的不太一样。直觉表明,对 lapply 的调用将返回一个函数列表,这些函数会将 1、2、3、...、10 添加到它们的参数中。

事实上,lapply(1:10,add) 返回一个函数列表,每个函数的参数都加 10。

在控制台中,我尝试了一个更简单的版本

> v<-lapply(1:3, add)
> v
[[1]]
function (y) 
x + y
<environment: 0x28b0540>

[[2]]
function (y) 
x + y
<environment: 0x28af678>

[[3]]
function (y) 
x + y
<environment: 0x28af800>
> v[[1]](1)
[1] 4
> v[[2]](1)
[1] 4
> v[[3]](1)
[1] 4
> 

很难看出这个结果的用途。

【讨论】:

  • 虽然很有趣,但这并不是问题的真正答案。
  • 书中提到添加
  • add 中包含一个 print(x) 向您展示了它是如何被调用的......但也会改变结果,因为它会在调用 add 期间强制对 x 进行评估。
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2016-05-02
相关资源
最近更新 更多