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