R中的lambda列表

R中的lambda列表,r,R,我想做一个R函数,它返回一个函数列表,每个函数在列表的不同部分上运行。然而,由于R的范围规则,这似乎是不可能的。下面是一个例子: functiontest = function() { foo = list() for(i in 1:3) { fixer = function(s) { return( function() { return(s) } )}

我想做一个R函数,它返回一个函数列表,每个函数在列表的不同部分上运行。然而,由于R的范围规则,这似乎是不可能的。下面是一个例子:

functiontest = function() {
    foo = list()
    for(i in 1:3) {
        fixer = function(s) { return(
            function() {
                return(s)
            }
        )}
        foo[[i]] = fixer(i)
    }
    return(foo)
}

functiontest()[[2]]() #returns 3
即使删除命名的lambda“fixer”并使用即时函数也不能拯救我:

functiontest = function() {
    foo = list()
    for(i in 1:3) {
        foo[[i]]=(function(s) { return(
            function() {
                return(s)
            }
        )})(i)
    }
    return(foo)
}

functiontest()[[2]]() #returns 3
我想把这个退2。我如何重构这段代码以实现这一点


谢谢。

首先,您面临的问题与范围界定无关。第二,我不认为仅仅因为你不理解某件事就把它叫做白痴是个好主意

在您的示例中,由于R中的延迟求值机制,列表中的所有函数都返回相同的值。请参阅专门针对您的问题的
help(force)
。简而言之,您需要在调用函数时强制求值,这可以通过添加
force

functiontest = function() {
    foo = list()
    for(i in 1:3) {
        fixer = function(s) { 
            force(s) ### <<<---This is the only difference from your code ###
            return(
            function() {
                return(s)
            }
        )}
        foo[[i]] = fixer(i)
    }
    return(foo)
}
functiontest=function(){
foo=list()
(我在1:3中){
fixer=函数{
警队###
functiontest <- function()  lapply(1:3, function(s) {s; function() s})
> L <- functiontest()

> L[[1]]()
[1] 1

> L[[2]]()
[1] 2

> L[[3]]()
[1] 3