# [R] Vector of functions

Dennis Murphy djmuser at gmail.com
Sat Jul 2 22:04:52 CEST 2011

```Hi,

To amplify on Josh's cogent remarks, the reason you can't create a
vector of functions is because vectors are composed of atomic objects
and functions are not atomic objects:

> is.atomic(f.3)
 FALSE
> is.atomic(1)
 TRUE
> is.atomic(TRUE)
 TRUE
> is.atomic('a')
 TRUE

'Vectors' of functions are actually (and appropriately) assigned to
lists. You can check the structure of any R object with str():

> fns <- c(f.1, f.2, f.3)
> str(fns)   ## Oops, R coerced your vector into a list
List of 3
\$ :function (a)
..- attr(*, "source")= chr [1:3] "function(a) {" ...
\$ :function (a)
..- attr(*, "source")= chr [1:3] "function(a) {" ...
\$ :function (a)
..- attr(*, "source")= chr [1:3] "function(a) {" ...

> funs <- list(f.1, f.2, f.3)    # clearer code
> str(funs)
List of 3
\$ :function (a)
..- attr(*, "source")= chr [1:3] "function(a) {" ...
\$ :function (a)
..- attr(*, "source")= chr [1:3] "function(a) {" ...
\$ :function (a)
..- attr(*, "source")= chr [1:3] "function(a) {" ...
> identical(fns, funs)   # Are the two objects identical?
 TRUE

You can have all kinds of fun with (lists of) functions. I wanted to

> curve(funs[], -10, 10)
Error in curve(funs[], -10, 10) :
'expr' must be a function, call or an expression containing 'x'

## Oh yeah, the argument of the function that curve() needs is x.
## We don't need to rewrite the function, though:

> curve(funs[](x), -10, 10)

Now one can verify that the function calls make sense:

> funs[](0)
 1
> funs[](pi/2)
 0.1588316
> funs[](2 * pi)
 1.394927e-05
> funs[](Inf)
 0

If you're going to be doing a lot of work with functions, I'd suggest
picking up a book on R programming. Fortunately, there's a good one
auf Deutsch by Uwe Ligges: Programmieren mit R.
http://www.statistik.tu-dortmund.de/~ligges/PmitR/
and several good ones in English. See the book list page at CRAN:
http://www.r-project.org/doc/bib/R-books.html

HTH,
Dennis

On Sat, Jul 2, 2011 at 9:36 AM, Thomas Stibor <thomas.stibor at in.tum.de> wrote:
> Hi there,
>
> I have a vector of some functions e.g.
> #-----------------------------#
> f.1 <- function(a) {
>  return( a );
> }
> f.2 <- function(a) {
>  return( 1 - (tanh(a))^2 );
> }
> f.3 <- function(a) {
>  return( 1 / (1+exp(-a)) * (1 - (1 / (1+exp(-a)))) );
> }
>
> func.l <- c(f.1, f.2, f.3);
> #-----------------------------#
>
> and would like to calculate the output value of a function in the
> vector, that is, pick e.g. function at position 2 in func.l and calculate the
> output value for a=42.
>
> func.l(42); # gives error
>
> f <- func.l;
> f(42); # gives error
>
> Is there an easy way to solve this problem?
>
> Cheers,
>  Thomas
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help