我想通过在上一次迭代中调用函数来在循环中重新定义函数。但是我知道这基本上是我不希望使用的递归方法。举个例子,请看下面
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太接近限制了”。我猜问题出在这种“递归方式”上。我试图在每个循环中重新标记该函数,但是它不起作用。有什么办法可以解决这个问题?
当您要引用myfunction
中的最新条目时,直接指的是result
。如果您打印myfunction
或result
,您将明白为什么它不起作用。
您可以改用所需的实际函数创建一个字符串,然后解析它。我在下面创建了一个样本函数,其中每个迭代将先前的函数结果乘以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创建