Nothing
numericDerivR <- function(expr, theta, rho = parent.frame(), dir = 1,
eps = .Machine$double.eps ^ (1/if(central) 3 else 2), central = FALSE)
## Note: Must this expr must be set up as a call to work properly?
## We set eps conditional on central. But central set AFTER eps. Is this OK?
{ ## cat("numericDeriv-Alt\n")
dir <- rep_len(dir, length(theta))
stopifnot(is.finite(eps), eps > 0)
## rho1 <- new.env(FALSE, rho, 0)
if (!is.character(theta) ) {stop("'theta' should be of type character")}
if (is.null(rho)) {
stop("use of NULL environment is defunct")
# rho <- R_BaseEnv;
} else {
if(! is.environment(rho)) {stop("'rho' should be an environment")}
# int nprot = 3;
}
if( ! ((length(dir) == length(theta) ) & (is.numeric(dir) ) ) )
{stop("'dir' is not a numeric vector of the correct length") }
if(is.na(central)) { stop("'central' is NA, but must be TRUE or FALSE") }
res0 <- eval(expr, rho) # the base residuals. C has a check for REAL ANS=res0
nt <- length(theta) # number of parameters
mr <- length(res0) # number of residuals
JJ <- matrix(NA, nrow=mr, ncol=nt) # Initialize the Jacobian
for (j in 1:nt){
origPar<-get(theta[j],rho) # This is parameter by NAME, not index
xx <- abs(origPar)
delta <- if (xx == 0.0) {eps} else { xx*eps }
## JN: I prefer eps*(xx + eps) which is simpler?
prmx<-origPar+delta*dir[j]
assign(theta[j],prmx,rho)
res1 <- eval(expr, rho) # new residuals (forward step)
# cat("res1:"); print(res1)
if (central) { # compute backward step resids for central diff
prmb <- origPar - dir[j]*delta
assign(theta[j], prmb, envir=rho) # may be able to make more efficient later?
resb <- eval(expr, rho)
JJ[, j] <- dir[j]*(res1-resb)/(2*delta) # vectorized
} else { ## forward diff
JJ[, j] <- dir[j]*(res1-res0)/delta
} # end forward diff
assign(theta[j],origPar, rho) # reset value
} # end loop over the parameters
attr(res0, "gradient") <- JJ
return(res0)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.