maechler@stat.math.ethz.ch
2001-May-28 08:45 UTC
[Rd] bugs in deriv(*, *, function.arg = ) (PR#953)
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 _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._