【问题标题】:Calling functions from a list recursively递归调用列表中的函数
【发布时间】:2015-08-19 15:55:19
【问题描述】:

我正在编写一个程序,在该程序中我需要一个函数来调用预先确定的函数,该函数可能会再次调用之前确定的函数,依此类推。但是,我发现自己无法在 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
}

(...)

或者有没有其他方法可以做我想做的事情?

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

【问题讨论】:

  • 看看this post也许,按照公认的解决方案你可以试试functions[[i]] &lt;- eval(parse(text=paste0("function(x){functions[[",i-1,"]](x) + x}")))
  • 查看formals( f )函数。我将举例说明我的意思

标签: r


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多