Function R循环中的求值变量
我尝试使用For循环迭代生成一些函数: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
# 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)