[R] Handling functions as objects

Duncan Murdoch murdoch.duncan at gmail.com
Thu Mar 29 19:34:01 CEST 2012


On 29/03/2012 1:02 PM, Julio Sergio wrote:
> I learnt that functions can be handled as objects, the same way the variables
> are. So, the following is perfectly valid:
>
> >  f = function(a, b) {
> +    print(a)
> +    print(b)
> + }
> >
> >  f1 = function(foo) {
> +    foo(1,2)
> + }
> >
> >  f1(f)
> [1] 1
> [1] 2
> >
>
> I also know that operators are functions, so, I can call:
>
> >  '+'(1,2)
> [1] 3
> >
>
> However, when I want to pass the '+' function to the previous f1 function, it
> doesn't work:
>
> >  f1('+')
> Error en f1("+") : no se pudo encontrar la función "foo"
> >
>
> (Error in f1("+") : the function "foo" cannot be found)
>
> Do you have any comments on this?

You are seeing the effects of the evaluator and parser being helpful.  
When you say

foo(1,2)

the evaluator looks for an object that appears to be a function and 
evaluates it.  Since foo is a character vector in your last example, it 
skips over that one, and never finds another.

When you say

'+'(1,2)

the parser sees a string constant being used in a context where a 
function name is needed, so it helpfully converts it to an object name, 
and then the evaluator looks up that name, and finds the addition function.

You can get the results you want by using f1(`+`), i.e. being explicit 
about passing the name of the addition function.  If you have a string 
containing a function name, you need to explicitly use get() to retrieve 
it.  Use get(foo, mode="function") to skip over non-functions.

Duncan Murdoch



More information about the R-help mailing list