Hi,
I'm trying to compile two functions into one function. the first funtion is
called 'fs' which is self-made function, another function is from the
built-in 'integration' function that is copy-paste-edited. If built
separatey, these functions work well. However that is not the case if
combines together, where certainly I made mistake somewhere when
constructing the code.
can someone help point out the mistakes for me please?
Thanks!
Aehan
____________________
intgfun<- function(a,b,c,mu,alpha,xi,upper, ...,subdivisions = 100, rel.tol
= .Machine$double.eps^0.25,
abs.tol = rel.tol, stop.on.error = TRUE, keep.xy = FALSE,
aux = NULL)
{
x<-vector()
fs<-function(x){
temp<-(-xi^(-1))*log(1-xi*(x-mu)/alpha)
(((alpha^(-1))*(exp((-(1-xi)*temp)-exp(-temp))))*((a*(x-c)^0.5)+(b*(x-c))))
}
return(fs)
intgrt<-function(lower)
{
call(fs)
fs <- match.fun(f)
ff <- function(x) f(x, ...)
limit <- as.integer(subdivisions)
if (limit < 1 || (abs.tol <= 0 && rel.tol < max(50 *
.Machine$double.eps,
5e-29)))
stop("invalid parameter values")
if (is.finite(lower) && is.finite(upper)) {
wk <- .External("call_dqags", ff, rho = environment(),
as.double(lower), as.double(upper), as.double(abs.tol),
as.double(rel.tol), limit = limit, PACKAGE = "base")
}
else {
if (is.na(lower) || is.na(upper))
stop("a limit is missing")
if (is.finite(lower)) {
inf <- 1
bound <- lower
}
else if (is.finite(upper)) {
inf <- -1
bound <- upper
}
else {
inf <- 2
bound <- 0
}
wk <- .External("call_dqagi", ff, rho = environment(),
as.double(bound), as.integer(inf), as.double(abs.tol),
as.double(rel.tol), limit = limit, PACKAGE = "base")
}
res <- wk[c("value", "abs.error",
"subdivisions")]
res$message <- switch(wk$ierr + 1, "OK", "maximum number
of
subdivisions reached",
"roundoff error was detected", "extremely bad integrand
behaviour",
"roundoff error is detected in the extrapolation table",
"the integral is probably divergent", "the input is
invalid")
if (wk$ierr == 6 || (wk$ierr > 0 && stop.on.error))
stop(res$message)
res$call <- match.call()
class(res) <- "integrate"
res
}
return (intgrt)}
[[alternative HTML version deleted]]
Rui Barradas
2012-Sep-25 13:04 UTC
[R] how to pass a function to a function inside a function
Hello,
Your function creates the vector 'x', then creates the function fs(),
then returns the function just created. It _never_ reaches the line
intgrt <- function(lower) {
and therefore never creates this last function. Now supposed it did. In
the very end you make the same mistake, you simply return the function
without ever calling it.
Hope this helps,
Rui Barradas
Em 25-09-2012 13:28, Al Ehan escreveu:> Hi,
>
> I'm trying to compile two functions into one function. the first
funtion is
> called 'fs' which is self-made function, another function is from
the
> built-in 'integration' function that is copy-paste-edited. If built
> separatey, these functions work well. However that is not the case if
> combines together, where certainly I made mistake somewhere when
> constructing the code.
>
> can someone help point out the mistakes for me please?
>
> Thanks!
> Aehan
>
> ____________________
>
> intgfun<- function(a,b,c,mu,alpha,xi,upper, ...,subdivisions = 100,
rel.tol
> = .Machine$double.eps^0.25,
> abs.tol = rel.tol, stop.on.error = TRUE, keep.xy = FALSE,
> aux = NULL)
>
> {
> x<-vector()
> fs<-function(x){
> temp<-(-xi^(-1))*log(1-xi*(x-mu)/alpha)
>
> (((alpha^(-1))*(exp((-(1-xi)*temp)-exp(-temp))))*((a*(x-c)^0.5)+(b*(x-c))))
> }
> return(fs)
>
> intgrt<-function(lower)
> {
> call(fs)
> fs <- match.fun(f)
> ff <- function(x) f(x, ...)
> limit <- as.integer(subdivisions)
> if (limit < 1 || (abs.tol <= 0 && rel.tol < max(50 *
> .Machine$double.eps,
> 5e-29)))
> stop("invalid parameter values")
> if (is.finite(lower) && is.finite(upper)) {
> wk <- .External("call_dqags", ff, rho =
environment(),
> as.double(lower), as.double(upper), as.double(abs.tol),
> as.double(rel.tol), limit = limit, PACKAGE = "base")
> }
> else {
> if (is.na(lower) || is.na(upper))
> stop("a limit is missing")
> if (is.finite(lower)) {
> inf <- 1
> bound <- lower
> }
> else if (is.finite(upper)) {
> inf <- -1
> bound <- upper
> }
> else {
> inf <- 2
> bound <- 0
> }
> wk <- .External("call_dqagi", ff, rho =
environment(),
> as.double(bound), as.integer(inf), as.double(abs.tol),
> as.double(rel.tol), limit = limit, PACKAGE = "base")
> }
> res <- wk[c("value", "abs.error",
"subdivisions")]
> res$message <- switch(wk$ierr + 1, "OK", "maximum
number of
> subdivisions reached",
> "roundoff error was detected", "extremely bad
integrand behaviour",
> "roundoff error is detected in the extrapolation table",
> "the integral is probably divergent", "the input is
invalid")
> if (wk$ierr == 6 || (wk$ierr > 0 && stop.on.error))
> stop(res$message)
> res$call <- match.call()
> class(res) <- "integrate"
> res
> }
> return (intgrt)}
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.