user16971617
user16971617

Reputation: 535

expression object in R

In R, I can calculate the first-order derivative as the following:

g=expression(x^3+2*x+1)
gPrime = D(g,'x')
x = 2
eval(g)

But I think it's not very readable. I prefer to do something like this:

f = function(x){
  x^3+2*x+1
}
fPrime = D(g,'x') #This doesn't work
fPrime(2)

Is that possible? Or is there a more elegant way to do ?

Upvotes: 1

Views: 79

Answers (1)

G. Grothendieck
G. Grothendieck

Reputation: 269694

1) D This depends on the particular form of f but for similar ones whose body is one line surrounded by {...} and whose single argument is x and whose operations are in the derivative table this works:

# f is from question
f = function(x){
  x^3+2*x+1
}

df <- function(f) {
  fun <- function(x) {}
  environment(fun) <- environment(f)
  body(fun) <- D(body(f)[[2]], "x")
  fun
}

df(f)
## function (x) 
## 3 * x^2 + 2

2) numDeriv::grad Also consider doing this numerically:

library(numDeriv)
grad(f, 2)
## [1] 14

3) deriv Another approach is to use deriv in the base of R with similar restrictions to (1).

df2 <- function(f) {
  fun <- function(x) {
    f2 <- deriv(body(f)[[2]], "x", function.arg = TRUE)
    attr(f2(x), "gradient")
  }
  environment(fun) <- environment(f)
  fun
}
f2Prime <- df2(f)
f2Prime(2)
##       x
## [1,] 14

4) Deriv::Deriv Another apprroach is the Deriv package.

library(Deriv)

Deriv(f, "x")
## function (x) 
## 2 + 3 * x^2

Upvotes: 3

Related Questions