49

I am trying to call a function with a given string of the function name.

E.g.

print(funcList)
[[1]]
`*`

[[2]]
sin

works:

mult <- `*`
mult(5,6)
[1] 30

doesn't work:

func1 <- funcList[[1]]
func1(5,6)

func2 <- funcList[[2]]
func2(1.2)

So is it possible to call all of the functions in the functionList?

tObi
  • 1,864
  • 3
  • 20
  • 32

3 Answers3

57

Those don't look like strings; that looks like a list of functions. To answer the question posed in your title, see get(). For example, using your list but stored as character strings:

funcList <- list("*", "sin")

we can use get() to return the function with name given by the selected element of the list:

> f <- get(funcList[[1]])
> f
function (e1, e2)  .Primitive("*")
> f(3,4)
[1] 12

An alternative is the match.fun() function, which given a string will find a function with name matching that string:

> f2 <- match.fun(funcList[[1]])
> f2(3,4)
[1] 12

but as ?match.fun tells us, we probably shouldn't be doing that at the prompt, but from within a function.

If you do have a list of functions, then one can simply index into the list and use it as a function:

> funcList2 <- list(`*`, sin)
> str(funcList2)
List of 2
 $ :function (e1, e2)  
 $ :function (x)  
> funcList2[[1]](3, 4)
[1] 12
> funcList2[[2]](1.2)
[1] 0.9320391

or you can save the functions out as interim objects, but there is little point in doing this:

> f3 <- funcList2[[1]]
> f3(3,4)
[1] 12
> f4 <- funcList2[[2]]
> f4(1.2)
[1] 0.9320391
Gavin Simpson
  • 170,508
  • 25
  • 396
  • 453
  • thanks for the answer. but you were right.. i dont have a list of strings i have a list of functions. can you tell me how to do that with a list of functions too? – tObi Jun 19 '11 at 21:32
  • @tobi as @Joshua mentioned in his comment above, what you did works for me. I have updated my answer to show you what works. If the example in my Answer doesn't work for you, edit your question to show us the exact output R gives when you try this. – Gavin Simpson Jun 19 '11 at 22:13
34

See documentation for do.call.

A quick demonstration:

do.call("rnorm", list(100, 0, 1))

first parameter can be a string literal, or R object, and the second one is list of arguments that are to be matched with provided function formal arguments.

aL3xa
  • 35,415
  • 18
  • 79
  • 112
7

you could also use match.fun

> functionlist <- list("*","sin")
> f <- match.fun(functionlist[[1]])
> f(5,6)
[1] 30
mccandar
  • 778
  • 8
  • 16