объект выражения в R

#r

Вопрос:

В R я могу вычислить производную первого порядка следующим образом:

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

Но я думаю, что это не очень читабельно. Я предпочитаю делать что-то вроде этого:

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

Возможно ли это? Или есть более элегантный способ сделать это ?

Ответ №1:

1) D Это зависит от конкретной формы f, но для аналогичных, тело которых представляет собой одну строку, окруженную { … }, единственным аргументом которой является x, и чьи операции находятся в таблице производных, это работает:

 # 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::град Также подумайте о том, чтобы сделать это численно:

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

3) вывод Другой подход заключается в использовании deriv в базе R с аналогичными ограничениями (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) Вывод::Вывод Еще одним приближением является пакет вывода.

 library(Deriv)

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