Skip to content

Extracting the name of a function (inverse of match.fun("myFun"))

6 messages · Peter Langfelder, Eloi Mercier, William Dunlap +1 more

#
Hi all,

is there a way to extract the name of a function, i.e. do the reverse
of match.fun applied to a character string? I would like to print out
the name of a function supplied to another function as an argument.

For example:

myFunc = function(x) { x+1 }

applyFunc = function(fnc, x)
{
  fnc = match.fun(fnc)
  fnc(x)
}

Is there a way to obtain "myFunc" from the argument fnc in applyFnc
the following call is issued?

applyFnc(myFunc, 1)



Thanks,

Peter
#
On Wed, Aug 29, 2012 at 3:36 PM, Peter Langfelder
<peter.langfelder at gmail.com> wrote:
...or am I missing the basic fact that since arguments to functions in
R are passed by copy, the name is lost/meaningless?

Thanks,

Peter
#
On 12-08-29 04:00 PM, Peter Langfelder wrote:
You can pass the function name as a string.

applyFunc = function(fun, x)
{
   fnc = match.fun(fun)
    fnc(x)
    print(fun)
}

applyFunc("myFunc", 1)
[1] "myFunc"

PS : avoid renaming the name of your argument within the function ("fnc 
= match.fun(fnc)").

Cheers,

Eloi

  
    
#
deparse(substitute(fnc)) will get you part way there.

myFunc <- function(x) x + 1
applyFunc <- function(fnc, x) {
    cat("fnc is", deparse(substitute(fnc)), "\n")
    fnc <- match.fun(fnc)
    fnc(x)
}
fnc is myFunc
[1] 2 3 4
fnc is function(x) x * 10
[1] 10 20 30
fnc is "myFunc"
[1] 2 3 4

I like to let the user override what substitute might say by
making a new argument out of it:
fnc is function(x) x * 10
[1] 10 20 30
fnc is Times 10
[1] 10 20 30
This makes is easier to call your function from another one - you
can pass the fncString down through a chain of calls.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
#
On 30/08/12 10:36, Peter Langfelder wrote:
You can just do:

applyFunc = function(fnc, x)
{
   fnc(x)
}

You don't need to get the function's name.

That being said, you seem basically to be re-inventing do.call() in a 
rather kludgy
way.  I would advise you to think carefully through what you are trying 
to accomplish.

     cheers,

         Rolf Turner

P. S. If you really want to get the *name* of the argument "fnc", you 
can use
good old deparse(substitute(...)).  As in:

     fname <- deparse(substitute(fnc))

But as I said, you don't need to do this for what seems to be your purpose,
and so it's all rather off the point.

         R. T.
#
On Wed, Aug 29, 2012 at 4:14 PM, William Dunlap <wdunlap at tibco.com> wrote:
...
Thanks, very good suggestions. The function I am writing is of course
much more complicated than the simplistic example.

Peter