【问题标题】:Call function in redefining the function in R在 R 中重新定义函数时调用函数
【发布时间】:2020-02-12 19:03:12
【问题描述】:

我想通过调用上次迭代中的函数来重新定义我的函数。但是我知道这基本上是一种我不想要的递归方式。举个例子,看下面

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 太接​​近限制”。我想问题在于这种“递归方式”。我试图在每个循环中重新标记该函数,但它不起作用。有没有办法解决这个问题?

**一个具体的例子如下

# loop for calculating the density function
for(j in 2:length(full_x))
{

# define the normal density
trued<-function(y){dnorm(full_x[j],mean=y*full_x[j-1],sd=true_eps)}

# joint distribution
# which is normal density multiplied by a piror
if(j>=3)
{
  trued<- function(y){trued(y)**true_density(y)}
}

# integration of the density w.r.t. rho
trueint<-integrate(trued, lower = 0, upper = 1)$value

# density function 
true_density<-function(y) {trued(y)/trueint}

# save into list
dyn_density_true[[j-1]]<-true_density
}

我想做的是计算一系列密度函数。在第一步中,它只是一个通过其积分加权的正态密度(即后验密度)。在接下来的步骤中,我需要先使用上一步的密度函数,然后再做同样的练习。

【问题讨论】:

  • 你能提供更多关于你想要做什么的细节吗?也许让我们抛出和明确和最小的示例,您可以在其中展示旧的和新的“函数定义”。对我来说,这听起来像是 XY problem。

标签: r function recursion


【解决方案1】:

当您想引用result 中的最新条目时,您直接引用myfunction。如果您打印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 日创建

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 2022-12-13
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2016-10-19
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多