我在循环的每次迭代中计算一个新值。该值被传递给函数列表(它基本上是相应函数中x的系数)。我想到的代码就是:
func_list <-list()
variable_list <-list()
for (i in 1:3){
variable[[i]] <- calculated.value
func_list[[i]]<- function(x){ variable[[i]] * x}
}
然而,它不起作用。问题是所有功能都将具有实际的相对参考&#34;无论我是否调用func_list [[1]],func_list [[2]]或func_list [[3]],在相应的列表位置变量[[i]]。也就是说,如果我想稍后调用不同的函数(将应用于不同的列),那么它只调用最后存储的变量[[3]]。 我想用另一种方法来表达问题的是:我怎样才能将每个循环迭代的计算绝对值传递给函数? (这样我基本上不需要变量[[i]]列表)
答案 0 :(得分:2)
我会单独计算每一步。
variable <- sapply(1:3, FUN = function(x) rnorm(1))
func_list(variable, FUN = function(y, x) y * x, x = x)
或者如果x
也是一个列表(而不是常量),您可以使用mapply
。
mapply(FUN = function(y, x) y * x, y = variable, x = x)
答案 1 :(得分:1)
你需要所谓的闭包 - 当定义函数时,R从作用域中获取非局部变量。因此,如果你将函数包装在另一个函数中,那将存储内部函数可访问的变量(下面,我称之为y - 存在称为y的全局变量不应该以任何方式影响行为),并返回函数(现在可以访问存储的变量):
#outside the loop:
wrapper <- function(a) {y<- a
function(x) {y*x}
}
#inside the loop
func_list[[i]] <- wrapper(variable[[i]])