我想在R中创建一个函数列表,其中来自for循环的值存储在函数定义中。这是一个例子:
init <- function(){
mod <- list()
for(i in 1:3){
mod[[length(mod) + 1]] <- function(x) sum(i + x)
}
return(mod)
}
mod <- init()
mod[[1]](2) # 5 - but I want 3
mod[[2]](2) # 5 - but I want 4
在上面的例子中,无论我调用哪个函数,i
始终是for循环序列中的最后一个值,我理解这是正确的行为。
我正在寻找能够实现这一目标的东西:
mod[[1]] <- function(x) sum(1 + x)
mod[[2]] <- function(x) sum(2 + x)
mod[[3]] <- function(x) sum(3 + x)
答案 0 :(得分:2)
您可以使用i
明确确保{for}循环中的force
的当前值得到评估。
init <- function(){
mod <- list()
f_gen = function(i) {
force(i)
return(function(x) sum(i + x))
}
for(i in 1:3){
mod[[i]] <- f_gen(i)
}
return(mod)
}
mod <- init()
mod[[1]](2)
# [1] 3
mod[[2]](2)
# [1] 4
更多详情请见Functions/Lazy Evaluation subsection of Advanced R。当然,请参阅?force
。您的示例相当类似于?force
中提供的示例。
使用单函数生成器函数(上面代码中的f_gen
)似乎比函数列表生成器函数更有意义。使用我的f_gen
代码可以简化:
f_gen = function(i) {
force(i)
return(function(x) sum(i + x))
}
mod2 <- lapply(1:3, f_gen)
mod2[[1]](2)
# [1] 3
mod2[[2]](2)
# [1] 4
## or alternately
mod3 = list()
for (i in 1:3) mod3[[i]] <- f_gen(i)
mod3[[1]](2)
mod3[[2]](2)