R语言循环递归定义积分函数时闭包取值异常问题求助
R语言循环递归定义积分函数时闭包取值异常问题求助
大家好,我现在在处理一个积分计算任务,核心需求是把一系列g_k(x,s)函数存入列表,方便后续递归调用。
先给出我的参数设置:
n = 500 k = 3 g_1 <- 1 rho <- sqrt( ((k-1)*(n-k))/(k*(n-k+1)) ) tau2 <- (sqrt( n / (k*(n-k+1))))
最开始我手动实现了k=1到4的函数,存入g_lst后运行结果完全正常:
g_lst <- c() g1 <- function(x,s){ return( 1 ) } g_lst <- c(g_lst,g1) g2 <- function(x,s){ return( integrate(function(y){g_lst[[1]](y,s)*(dnorm(y,rho*x,tau2)+dnorm(y,-rho*x,tau2))},0,s)[[1]] ) } g_lst <- c(g_lst,g2) g3 <- function(x,s){ return( integrate(function(y){g_lst[[2]](y,s)*(dnorm(y,rho*x,tau2)+dnorm(y,-rho*x,tau2))},0,s)[[1]] ) } g_lst <- c(g_lst,g3) g4 <- function(x,s){ return( integrate(function(y){g_lst[[3]](y,s)*(dnorm(y,rho*x,tau2)+dnorm(y,-rho*x,tau2))},0,s)[[1]] ) } g_lst <- c(g_lst,g4)
但当我尝试用循环把这个过程通用化,生成函数列表g_lst2时,问题出现了:
g_lst2 <- c() g1 <- function(x,s){ return( 1 ) } g_lst2 <- c(g_lst2,g1) for (i in 1:3){ i <- force(i) gk <- function(x,s){ return( integrate(function(y){g_lst[[i]](y,s)*(dnorm(y,rho*x,tau2)+dnorm(y,-rho*x,tau2))},0,s)[[1]] ) } force(gk) g_lst2 <- c(g_lst2,gk) }
调用列表里的函数时,所有g_lst2[[2]]、g_lst2[[3]]、g_lst2[[4]]的结果都和g_lst2[[4]]完全一致,而手动定义的g_lst里的函数结果是正常分层的:
g_lst2[[2]](2,2) #[1] 1.811419 g_lst2[[3]](2,2) #[1] 1.811419 g_lst2[[4]](2,2) #[1] 1.811419 g_lst[[2]](2,2) #[1] 0.7380149 g_lst[[3]](2,2) #[1] 1.156224 g_lst[[4]](2,2) #[1] 1.811419
我查了相关讨论,感觉应该用force()函数解决闭包的延迟绑定问题,但我当前的用法好像没起作用,有没有大佬能帮我看看问题出在哪?
备注:内容来源于stack exchange,提问作者crtpritch
相关产品推荐
相关产品推荐

