# [Rd] Automatic Differentiation for R

Gabor Grothendieck ggrothendieck at gmail.com
Tue May 19 15:57:34 CEST 2009

```On Tue, May 19, 2009 at 9:08 AM, Martin Maechler
<maechler at stat.math.ethz.ch> wrote:
> [MM stumbling over on old thread ... he'd be interested]
>
>>>>>> "GaGr" == Gabor Grothendieck <ggrothendieck at gmail.com>
>>>>>>     on Wed, 15 Apr 2009 09:53:18 -0400 writes:
>
>    GaGr> Not sure if this is sufficient for your needs but R does include symbolic
>    GaGr> differentiation, see ?D, and the Ryacas and rSymPy
>    GaGr> packages interface R to the yacas and sympy computer algebra
>    GaGr> systems (CAS) and those system include symbolic differentiation.
>
> No, symbolic differentiation is not enough.
> Automatic Differentiation (AD) is something much more general (in one
> way) and much less mathematical from  a classical view point:
> But then, AD is much more generally useful for minimization as, basically,
> the input is an R function
>    f(x)               {with x multidimensional}
> or  f(x1,x2, ..., xp)  {with scalar x1, x2, ..}
> and the output is again an R function
> which computes f() and all {or just selected} partial
> derivatives  d f / d{xi}.
>
> Now consider that the function f()  can contain if() and while()
> clauses and conceptually ever language feature of R.
> In practice, I'm pretty sure the list of features would have to
> be restricted, similarly as they'd have to for an R compiler to
> be feasible.
>
> I agree that  AD for R would be very nice and could be very
> useful.
> I'd also be interested to help AD people learn the S4 classes
> and methods (hoping that it's close enough to what they call
> than the powerful S4 class/methods system).

this thread including a complete illustration of using them for the
problem at hand.

Ryacas also supports automatic differentiation
of one line R functions but its not fully developed and very limited.
See demo("Ryacas-Function") which shows differentiation of the
Burr CDF to get the PDF.

these packages.

> library(Ryacas)
> x <- Sym("x")
> x+x
[1] "Starting Yacas!"
expression(2 * x)

> library(rSymPy)