deriv(expr, ...) ## Default S3 method: deriv(expr, namevec, function.arg = NULL, tag = ".expr", hessian = FALSE, ...) ## S3 method for class 'formula': deriv(expr, namevec, function.arg = NULL, tag = ".expr", hessian = FALSE, ...)deriv3(expr, ...) ## Default S3 method: deriv3(expr, namevec, function.arg = NULL, tag = ".expr", hessian = TRUE, ...) ## S3 method for class 'formula': deriv3(expr, namevec, function.arg = NULL, tag = ".expr", hessian = TRUE, ...)
expr | the expression to be differentiated. Typically a formula, in which case the expression returned computes the right side of the ~ and its derivatives. |
namevec | a character vector of the names of parameters. (Derivatives are computed for these variables only.) |
function.arg | a character vector, a function prototype, or the logical value TRUE. Optional. If this argument is present, then the return value is in the form of a function instead of a multiple-statement expression. See Details for more information. |
tag | the base of the names to give to intermediate results. The default is ".expr". |
hessian | a logical value. If TRUE, then the second derivatives are calculated and included in the return value. The default is FALSE. |
... | other arguments to pass to or from the function. |
# Value and gradient of the Michaelis-Menten model deriv(~ Vm*conc/(K+conc), c("Vm","K")) ## expression({ ## .expr1 <- Vm * conc ## .expr2 <- K + conc ## .value <- .expr1/.expr2 ## .grad <- array(0, c(length(.value), 2), ## list(NULL, c("Vm", "K"))) ## .grad[, "Vm"] <- conc/.expr2 ## .grad[, "K"] <- - (.expr1/(.expr2^2)) ## attr(.value, "gradient") <- .grad ## .value ## } ## )# Return a function as the result deriv(~ Vm*conc/(K+conc), c("Vm","K"), function(Vm, K, conc = 1:10) NULL) ## function(Vm, K, conc = 1:10) ## { ## .expr1 <- Vm * conc ## .expr2 <- K + conc ## .value <- .expr1/.expr2 ## .grad <- array(0, c(length(.value), 2), ## list(NULL, c("Vm", "K"))) ## .grad[, "Vm"] <- conc/.expr2 ## .grad[, "K"] <- - (.expr1/(.expr2^2)) ## attr(.value, "gradient") <- .grad ## .value ## }
# Return a function when "function.arg" is specified as "TRUE" deriv(~ Vm*conc/(K+conc), c("Vm","K"), TRUE) ## function (Vm, K) ## { ## .expr1 <- Vm * conc ## .expr2 <- K + conc ## .value <- .expr1/.expr2 ## .grad <- array(0, c(length(.value), 2L), list(NULL, c("Vm", ## "K"))) ## .grad[, "Vm"] <- conc/.expr2 ## .grad[, "K"] <- -(.expr1/.expr2^2) ## attr(.value, "gradient") <- .grad ## .value ## }
# Investigate the effect of the argument "hessian": deriv vs. deriv3 x <- 1:3; y <- 2:4 f <- deriv(~a^2, "a", TRUE) f(x) ## [1] 1 4 9 ## attr(,"gradient") ## a ## [1,] 2 ## [2,] 4 ## [3,] 6 f3 <- deriv3(~a^2, "a", TRUE) f3(x) ## [1] 1 4 9 ## attr(,"gradient") ## a ## [1,] 2 ## [2,] 4 ## [3,] 6 ## attr(,"hessian") ## , , a ## ## a ## [1,] 2 ## [2,] 2 ## [3,] 2
# Investigate "hessian" with two variables: x <- 1:3; y <- 2:4 g <- deriv(~a*b^2, c("a","b"), TRUE) g3 <- deriv3(~a*b^2, c("a","b"), TRUE) g3(x, y) ## attr(,"gradient") ## a b ## [1,] 4 4 ## [2,] 9 12 ## [3,] 16 24 ## attr(,"hessian") ## , , a ## ## a b ## [1,] 0 4 ## [2,] 0 6 ## [3,] 0 8 ## ## , , b ## ## a b ## [1,] 4 2 ## [2,] 6 4 ## [3,] 8 6