以递归方式从列表中调用函数

时间:2015-08-19 15:55:20

标签: r

我正在编写一个程序,其中我需要一个函数来调用事先确定的函数,这可能再次调用在它自己之前确定的函数,依此类推。但是,我发现自己无法在R中实现这一点。

这是我想要做的最小例子:

functions <- list()
functions[[1]] <- function(x){
  x
}

for (i in 2:10)
{
  functions[[i]] <- function(x){
    functions[[i-1]](x) + x
  }
}

所以在运行这个脚本之后,我想要发生的是当我调用functions[[10]](1)时,R确定函数在第9期中的值,它需要函数的值。期间8等等,并将输入添加到其中。 (很明显,输出应该是10)。

问题在于,当我这样做时,函数会无限地调用它自己。该列表如下所示:

[[1]]
function (x) 
{
    x
}

[[2]]
function (x) 
{
    functions[[i - 1]](x) + x
}

[[3]]
function (x) 
{
    functions[[i - 1]](x) + x
}

(...)

因此,当我致电functions[[10]](x)时,它会评估为functions[[9]](x) + x,但functions[[9]]会一直反复调用自己。

我有什么可以这样做的,我强迫R将i - 1的值写入列表的每个元素,这样它看起来如下?

[[1]]
function (x) 
{
    x
}

[[2]]
function (x) 
{
    functions[[1]](x) + x
}

[[3]]
function (x) 
{
    functions[[2]](x) + x
}

(...)

或者我还有其他办法可以做我想做的事吗?

(显然,在上面给出的例子中,我可以总结,但在我试图在这里模拟的应用程序中,这是不可能的,我不能想到另一种方法来做到这一点,而不是每个函数调用之前的那个)。

1 个答案:

答案 0 :(得分:1)

你去吧

functions <- list()
functions[[1]] <- function(x){
    x
}

for (i in 2:10)
{
    functions[[i]] <- function(x,i){
        functions[[i-1]](x) + x
    }
    formals(functions[[i]])$i <- i
}
functions[[10]](5) 
# 50