刚刚在我的R代码中发现了一个非常微妙的错误。以下代码将对象列表作为输入并为每个对象创建新字段。在R中创建动态函数的一个错误
每个对象最初有两个字段(w,p,s,u),然后我创建更多,beta,phi等等。正常变量都可以。但是动态函数(Q,K,K1,K2)不正确。假设我有两个nigs,nigs [[1]]和nigs [[2]],nigs [[1]]的函数Q,K,K1和K2与nigs [[2]]相同!
我刚刚发现这个错误,并会咨询如何获得此代码正确(同时保持它的优雅:)谢谢!
D <- length(nigs)
for (i in 1:D) {
w <- nigs[[i]]$w
p <- nigs[[i]]$p
s <- nigs[[i]]$s
u <- nigs[[i]]$u
nigs[[i]]$beta <- beta <- w/s * p * (1-p^2)^(-1/2);
nigs[[i]]$phi <- phi <- w^2/s^2;
nigs[[i]]$z <- z <- (x-u)/s;
nigs[[i]]$alpha_bar <- alpha_bar <- w * (1-p^2)^(-1/2);
nigs[[i]]$y_bar <- y_bar <- sqrt(1+z^2);
nigs[[i]]$Q <- Q <- function(t) { sqrt(1 - (2*beta*t+t^2)/phi) }
nigs[[i]]$K <- K <- function(t) { u*t - w*Q(t) + w }
nigs[[i]]$K1 <- K1 <- function(t) { (u + w * (beta+t)/(Q(t)*phi)) }
nigs[[i]]$K2 <- K2 <- function(t) { qt = Q(t); (w/(qt * phi) + w * (beta+t)^2/(qt^3 * phi^2)); }
}
编辑
我所做的主要错误是,我认为for { }
引入了新的领域,在这种情况下,w,p,s,u
是不同的,每次w,p,s,u
,其实不是。只有R中的函数引入新的范围。这个范围规则与C/Java不同。
我认为使用当地是一个比较优雅在这里。 – hadley 2012-02-01 13:41:44