[Rd] bugs in deriv(*, *, function.arg = ) (PR#953)
maechler@stat.math.ethz.ch
maechler@stat.math.ethz.ch
Mon, 28 May 2001 10:45:18 +0200 (MET DST)
Also, this should have gone in R-bugs quite a while ago :
------- start of forwarded message -------
From: Martin Maechler <maechler@stat.math.ethz.ch>
To: R-core@stat.math.ethz.ch
Subject: PROTECT() bugs in deriv(*, *, function.arg = )
Date: Mon, 16 Apr 2001 21:02:10 +0200
In R versions 0.50 and 0.64.2 ,
the following worked
> deriv(expression(sin(cos(x) * y)), c("x","y"), function(x,y){})
function (x, y)
{
.expr1 <- cos(x)
.expr2 <- .expr1 * y
.expr4 <- cos(.expr2)
.value <- sin(.expr2)
.grad <- array(0, c(length(.value), 2), list(NULL, c("x",
"y")))
.grad[, "x"] <- -.expr4 * (sin(x) * y)
.grad[, "y"] <- .expr4 * .expr1
attr(.value, "gradient") <- .grad
.value
}
which *was* S(-plus) compatible.
It stopped working with 0.65.1,
and later someone added to help(deriv) 's description of function.arg
\item{function.arg}{If specified, a character vector of arguments for
a function return, or a function (with empty body) or \code{TRUE},
the latter indicating that a function with argument names
\code{namevec} should be used.
the comment
>>>> \bold{Note:} this is incompatible with S.}
Today, I've been looking a bit at the C code and I can't understand why
giving the function.arg as a function doesn't work anymore.
(it just returns the 'empty' function.arg).
Interestingly, it *did* work when I ran things under gdb .. ? .. ?
The result is the same under gctorture(),
however, that does reveal a bug (missing PROTECT() ?),
clearly even under 1.2.2 :
> gctorture()
> deriv(expression(sin(x + y^2)), c("x", "y"),c("x", "y"))
[[1]]
.
{
.expr2 <- x + y^2
.expr4 <- cos(.expr2)
.value <- sin(.expr2)
.grad <- array(0, c(length(.value), 2), list(NULL, c("x",
"y")))
.grad[, "x"] <- .expr4
.grad[, "y"] <- .expr4 * (2 * y)
attr(.value, "gradient") <- .grad
.value
}
>
which is a pretty funny beast.
Something for PROTECT() specialists;
I think there really are two bugs, one when the `function.arg' is a
character vector (bug showing with gctorture()) and one when it is a
function (the body is just not set).
Note that I've committed a very slightly enhanced deriv.c for R-devel
but that should hopefully merge nicely once the bug is found and fixed on
R-release.
Martin
------- end of forwarded message -------
Note that the above "beast" is a "pairlist" ...
MM
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._