【问题标题】:R make functions with lapply: bug or what? [duplicate]R 用 lapply 创建函数:bug 还是什么? [复制]
【发布时间】:2015-03-29 13:56:09
【问题描述】:

我正在使用 lapply 创建新函数,并注意到有时它会返回预期的内容,有时它只返回最后创建的函数的副本。

这里是一个说明的例子,考虑一下我想制作以下简单的函数列表

listFuncs = lapply( 1:3, function(X){ 
  myfunc = function(y){X+y}
  myfunc
})

不幸的是,一个简单的评估表明我没有得到我希望的结果

listFuncs[[1]](10)
[1] 13
listFuncs[[2]](10)
[1] 13

确实,列表只包含函数

myfunc = function(y){3+y}

但是,如果我在创建函数的过程中输出了一些东西,例如

listFuncs = lapply( 1:3, function(X){ 
  myfunc = function(y){X+y}
  print(myfunc(0)) ## NEW LINE HERE !!!
  myfunc
})

那么我的函数列表是“如预期的那样”

[1] 1
[1] 2
[1] 3
> listFuncs[[1]](10)
[1] 11
> listFuncs[[2]](10)
[1] 12

有人明白发生了什么吗?提前,谢谢。

【问题讨论】:

  • 这不是错误,而是一项功能。研究“惰性评估”的概念。
  • @Roland 我对从here 开始的关于 r-devel 的长时间讨论感到惊讶,这似乎包括认真考虑这是一个错误的立场(至少是 Radford)。这是我第一次看到“官方”人士提出这种想法。
  • 似乎只有 Radford Neal 和 Jeroen Ooms 称其为错误,而且他们都不是官方的; Neal 显然对 R 了解很深,但他经常不同意 R-core。
  • @BenBolker 我认为 Luke 等人对改变行为(或至少讨论它)的开放态度是默认它至少是不可取的。

标签: r lapply


【解决方案1】:

你可以使用force函数:

listFuncs = lapply( 1:3, 
    function(X) { 
        force(X)
        myfunc <- function(y) { X+y }
        myfunc
    }
)
listFuncs[[1]](10) ## 11

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2016-04-04
    相关资源
    最近更新 更多