在R中 - 稍后将值从循环传递给函数以供函数使用

时间:2014-04-08 07:09:45

标签: r function loops

我在循环的每次迭代中计算一个新值。该值被传递给函数列表(它基本上是相应函数中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]]列表)

2 个答案:

答案 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]])