Function R循环中的求值变量

Function R循环中的求值变量,function,r,statistics,for-loop,Function,R,Statistics,For Loop,我尝试使用For循环迭代生成一些函数: # Create a list to hold the functions funcs <- list() funcs[] # loop through to define functions for(i in 1:21){ # Make function name funcName <- paste( 'func', i, sep = '' ) # make function func = functio

我尝试使用For循环迭代生成一些函数:

# Create a list to hold the functions
funcs <- list()
funcs[]

# loop through to define functions
for(i in 1:21){

    # Make function name
    funcName <- paste( 'func', i, sep = '' )

    # make function
    func = function(x){x * i}

    funcs[[funcName]] = func

    }
#创建一个列表来保存函数
funcs检查这个:

# Create a list to hold the functions
funcs <- list()
funcs[]

# loop through to define functions
for(i in 1:21){

    # Make function name
    funcName <- paste( 'func', i, sep = '' )

    # make function
    func = paste('function(x){x * ', i,'}',sep = '')

    funcs[[funcName]] = eval(parse(text=func))

    }
#创建一个列表来保存函数
funcs使用闭包(编写函数的函数):


multiply我对闭包(一般意义上)的理解是,它是一个函数,在定义时,将绑定到其定义词法范围内的变量。在R中,情况似乎并非如此,否则celenius最初的例子就会奏效。R是否允许以某种方式创建“真正”的闭包,可能是通过显式指定环境或其他什么?是的,因此每个函数中的每个“i”都绑定到循环索引中的“i”上。它们被绑定到变量而不是值。这是在任何函数式编程语言中都会得到的。不过Hadley的代码不起作用
funcs$func3(3)
应该返回9,但它返回63,就像
funcs
中的所有函数一样。leif,你的解释不太正确-是懒惰的计算阻止了我的代码工作。通过在闭包范围内显式地强制计算i,代码现在可以工作了。哈德利,你是对的。在原始示例中,R在循环结束之前不会计算乘法中的“i”,但“力”使其立即计算。如果您只关心一个变量,文档使其看起来净效果与使用“local”语句相同。
multiply <- function(i) {
  force(i)
  function(x) x * i
}

funcs <- list()
for(i in 1:21){
  funcName <- paste( 'func', i, sep = '' )
  funcs[[funcName]] = multiply(i)
}

# OR in one line, with lapply
funcs <- lapply(1:21, multiply)