在R中重新定义函数的调用函数

问题描述 投票:0回答:1

我想通过在上一次迭代中调用函数来在循环中重新定义函数。但是我知道这基本上是我不希望使用的递归方法。举个例子,请看下面

for(i in 1:3)
{
...
myfunction<-function(y){myfunction(y)*dnorm(full_x[j],mean=y*full_x[j-1],sd=true_eps)}
...
result[[i]]<-myfunction
}

[我想要的是,在步骤t中,定义了一个名为myfunction的函数,在步骤t + 1中,我想从最后一步开始使用myfunction来重新定义该函数,以便进行一些动态更新。程序不断给我错误:“错误:C堆栈使用7971152太接近限制了”。我猜问题出在这种“递归方式”上。我试图在每个循环中重新标记该函数,但是它不起作用。有什么办法可以解决这个问题?

r function recursion
1个回答
0
投票

当您要引用myfunction中的最新条目时,直接指的是result。如果您打印myfunctionresult,您将明白为什么它不起作用。

您可以改用所需的实际函数创建一个字符串,然后解析它。我在下面创建了一个样本函数,其中每个迭代将先前的函数结果乘以5。

f <- function(y) y**2
k <- 5
res <- list(f)

for (i in 1:3) {

  fstring <- paste0('function(y) k*res[[',i,']](y)')
  res[[i+1]] <- eval(parse(text =  fstring))

}
res
#> [[1]]
#> function(y) y**2
#> 
#> [[2]]
#> function(y) k*res[[1]](y)
#> 
#> [[3]]
#> function(y) k*res[[2]](y)
#> 
#> [[4]]
#> function(y) k*res[[3]](y)
lapply(res,function(f) f(2))
#> [[1]]
#> [1] 4
#> 
#> [[2]]
#> [1] 20
#> 
#> [[3]]
#> [1] 100
#> 
#> [[4]]
#> [1] 500

reprex package(v0.3.0)在2019-10-16创建

© www.soinside.com 2019 - 2024. All rights reserved.