R:在函数声明中使用For循环变量

R:在函数声明中使用For循环变量,r,closures,R,Closures,我想在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

我想在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

通过使用
force
,可以明确地确保在for循环中以其当前值对
i
求值

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

通过使用
force
,可以明确地确保在for循环中以其当前值对
i
求值

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

为什么?看起来很复杂。听起来你想声明另一个变量,比如
const,我添加了一个示例,说明我希望每个函数都是什么样子。我的实际用例更复杂。我只是想了解范围是如何工作的,为什么?看起来很复杂。听起来你想声明另一个变量,比如
const,我添加了一个示例,说明我希望每个函数都是什么样子。我的实际用例更复杂。我只是想了解范围是如何工作的。
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)