我如何理解这个R功能?

qed*_*qed 4 r function

mfibR <- local({
    memo <- c(1, 1, rep(NA, 1000))
    f <- function(x) {
        if (x == 0) 
            return(0)
        if (x < 0) 
            return(NA)
        if (x > length(memo)) 
            stop("x too big for implementation")
        if (!is.na(memo[x])) 
            return(memo[x])
        ans <- f(x - 2) + f(x - 1)
        memo[x] <<- ans
        ans
    }
})
Run Code Online (Sandbox Code Playgroud)

它没有函数体,但它实际上正确地返回了Fibonacci序列.

Chi*_*til 5

来自?local帮助页面.

local评估本地环境中的表达式.它等同于evalq,除了它的默认参数创建一个新的空环境.这对于创建匿名递归函数和作为一种有限的命名空间特征非常有用,因为从外部看不到环境中定义的变量.

请查看该local功能帮助页面中的示例.它显示了如何使用local创建匿名函数.local将返回最后评估的表达式.

  • +1 - 但还有一些关于它是如何工作的说法.它返回一个带有环境变量(`memo`)的递归函数(`f`),这样就可以存储已经计算过一次的东西,而不会再次计算. (3认同)
  • +1.查看"闭包"和"递归"作为一般编程术语也可能有助于理解这里. (2认同)
  • 和"memoization". (2认同)