私はintegrate.xy
関数のソースコードを調べましたが、xtol
引数の使用に関するバグがあるようです。
function (x, fx, a, b, use.spline = TRUE, xtol = 2e-08)
{
dig <- round(-log10(xtol))
f.match <- function(x, table) match(signif(x, dig), signif(table,
dig))
if (is.list(x)) {
fx <- x$y
x <- x$x
if (length(x) == 0)
stop("list 'x' has no valid $x component")
}
if ((n <- length(x)) != length(fx))
stop("'fx' must have same length as 'x'")
if (is.unsorted(x)) {
i <- sort.list(x)
x <- x[i]
fx <- fx[i]
}
if (any(i <- duplicated(x))) {
n <- length(x <- x[!i])
fx <- fx[!i]
}
if (any(diff(x) == 0))
stop("bug in 'duplicated()' killed me: have still multiple x[]!")
if (missing(a))
a <- x[1]
else if (any(a < x[1]))
stop("'a' must NOT be smaller than min(x)")
if (missing(b))
b <- x[n]
else if (any(b > x[n]))
stop("'b' must NOT be larger than max(x)")
if (length(a) != 1 && length(b) != 1 && length(a) != length(b))
stop("'a' and 'b' must have length 1 or same length !")
else {
k <- max(length(a), length(b))
if (any(b < a))
stop("'b' must be elementwise >= 'a'")
}
if (use.spline) {
xy <- spline(x, fx, n = max(1024, 3 * n))
if (xy$x[length(xy$x)] < x[n]) {
if (TRUE)
cat("working around spline(.) BUG --- hmm, really?\n\n")
xy$x <- c(xy$x, x[n])
xy$y <- c(xy$y, fx[n])
}
x <- xy$x
fx <- xy$y
n <- length(x)
}
ab <- unique(c(a, b))
xtol <- xtol * max(b - a)
BB <- abs(outer(x, ab, "-")) < xtol
if (any(j <- 0 == apply(BB, 2, sum))) {
y <- approx(x, fx, xout = ab[j])$y
x <- c(ab[j], x)
i <- sort.list(x)
x <- x[i]
fx <- c(y, fx)[i]
n <- length(x)
}
ai <- rep(f.match(a, x), length = k)
bi <- rep(f.match(b, x), length = k)
dfx <- fx[-c(1, n)] * diff(x, lag = 2)
r <- numeric(k)
for (i in 1:k) {
a <- ai[i]
b <- bi[i]
r[i] <- (x[a + 1] - x[a]) * fx[a] + (x[b] - x[b - 1]) *
fx[b] + sum(dfx[seq(a, length = max(0, b - a - 1))])
}
r/2
}
xtol
引数に与えられた値は、ラインxtol <- xtol * max(b - a)
に上書きされている:
参考のため、ここでintegrate.xy
関数のソースコードです。しかし、変数の値は、関数への入力に示されているように、元の値xtol
に基づいて計算されます。このため不一致の、f.match
関数は、ラインbi <- rep(f.match(b, x), length = k)
において、XおよびB(すなわち、NA
)との間に一致が返されていません。これにより、遭遇したエラーが発生します。
簡単な修正は、少なくとも問題の場合のために、xtol <- xtol * max(b - a)
行を削除することです。しかし、より厳密な修正のために、このパッケージの管理者にバグレポートを提出するべきです。
'に何のパッケージをintegrate.xy'されますか? – Gopala
パッケージは、すべてのRポスターに – user340803
sfsmiscある:基地R上に使用する場合は、常に、常に、常に 'コードで()'ラインライブラリを含みます。そのようなパッケージがあるとは決して考えないでください。 – Parfait