From Peter.Ruckdeschel at uni-bayreuth.de  Thu Jun 28 23:05:10 2007
From: Peter.Ruckdeschel at uni-bayreuth.de (Peter Ruckdeschel)
Date: Thu, 28 Jun 2007 23:05:10 +0200
Subject: [Rd] minor flaw in integrate()
Message-ID: <46842286.8080402@uni-bayreuth.de>

Hi,

I noticed a minor flaw in integrate() from package stats:

Taking up arguments lower and upper from integrate(),

   if (lower ==  Inf) && (upper ==  Inf)

       or

   if (lower == -Inf) && (upper == -Inf)

integrate() calculates the value for (lower==-Inf) && (upper==Inf).

Rather, it should return 0.

Quick fix:

### old code ###
### [snip]
    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")
    }
### [snip]

### new code  to replace the old one ###

### [snip]
    else {
            if (is.na(lower) || is.na(upper))
                stop("a limit is missing")

            if (lower == upper){

                wk <- list("value" = 0, "abs.error" = 0,
                        "subdivisions" = subdivisions,
                        "ierr" = 0 )

            } else {
                    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")

            }
    }
### [snip]

Best, Peter



[Rd] minor flaw in integrate()
Peter Ruckdeschel