[R] forcing evaluation of a char string argument

Charles C. Berry cberry at tajo.ucsd.edu
Thu Dec 23 18:39:22 CET 2010


On Wed, 22 Dec 2010, rballen wrote:

>
> Why does x in "assign(x)" correctly evaluate to "rank" where
> UseMethod(func) does not get correctly evaluated?

Because it is the body of a function definition.

If you want to plug in the value of 'func' in the body of that function, 
you need to do something like this:

toGeneric <- 
function(func) {
         env<-environment(get(func))

         # default method of new generic = the original function
         assign(paste(func,".default",sep=""),get(func),pos=env)
         foo <- function(x,...) {}
         lf <- list(x=func)
         body.foo <- substitute(UseMethod(x),lf)
         body(foo)<-body.foo
         assign(func,foo,pos=env)
}

BTW, are you sure you know what 'env' evaluates to?? (It is NOT the 
environment of the object named by the value of func in the parent.frame 
of toGeneric.)

HTH,

Chuck
>
> Can we use as.call(list(UseMethod,func))?
>
>>> assign(paste(func,".default",sep=""),get(func),pos=env)
>>>
>>> assign(func,function(x,...) UseMethod(func),pos=env)
>
> On Wed, Dec 22, 2010 at 9:03 PM, William Dunlap [via R]
> <ml-node+3161542-1898476570-206552 at n4.nabble.com> wrote:
>> Try the following, which I haven't tested much
>> and needs more error checking (e.g., to see that
>> the function is not already generic and that
>> its argument list is compatible with (x,...)).
>> I put in the print statements to show what
>> the calls to substitute() do.
>>
>> toGeneric <- function (funcName) {
>>     stopifnot(is.character(funcName))
>>     funcItself <- get(funcName)
>>     stopifnot(is.function(funcItself))
>>     envir <- environment(funcItself)
>>     tmp <- substitute(funcSymbol <- function(x, ...)
>> UseMethod(funcName),
>>         list(funcSymbol = as.symbol(funcName), funcName = funcName))
>>     print(tmp)
>>     eval(tmp, envir = envir)
>>     tmp <- substitute(defaultSymbol <- funcItself, list(defaultSymbol =
>> as.symbol(paste(sep = ".",
>>         funcName, "default")), funcItself = funcItself))
>>     print(tmp)
>>     eval(tmp, envir = envir)
>> }
>>
>> E.g.,
>>
>>    > wsx <- function(x, base=2)log(x, base=base)
>>    > toGeneric("wsx")
>>    wsx <- function(x, ...) UseMethod("wsx")
>>    wsx.default <- function (x, base = 2)
>>    log(x, base = base)
>>    > wsx
>>    function (x, ...)
>>    UseMethod("wsx")
>>    > wsx.default
>>    function (x, base = 2)
>>    log(x, base = base)
>>
>> Bill Dunlap
>> Spotfire, TIBCO Software
>> wdunlap tibco.com
>>
>>> -----Original Message-----
>>> From: [hidden email]
>>> [mailto:[hidden email]] On Behalf Of rballen
>>> Sent: Wednesday, December 22, 2010 2:42 PM
>>> To: [hidden email]
>>> Subject: [R] forcing evaluation of a char string argument
>>>
>>>
>>> I'm trying to make a function to turn a regular function into
>>> an S3 generic
>>> one. I want myMethod to be:
>>>
>>> function(x,...) UseMethod("myMethod")
>>>
>>> But I keep getting:
>>>
>>> function(x,...) UseMethod(func)
>>>
>>> Here's the function:
>>>
>>> toGeneric<-function(func) {
>>> env<-environment(get(func))
>>>
>>> # default method of new generic = the original function
>>> assign(paste(func,".default",sep=""),get(func),pos=env)
>>>
>>> assign(func,function(x,...) UseMethod(func),pos=env)
>>> }
>>>
>>> toGeneric("myMethod")
>>>
>>> I messed around with force, substitute, and deparse, but I
>>> can't get any of
>>> those to help.
>>>
>>> Thanks.
>>> --
>>> View this message in context:
>>> http://r.789695.n4.nabble.com/forcing-evaluation-of-a-char-str
>> ing-argument-tp3161365p3161365.html
>>> Sent from the R help mailing list archive at Nabble.com.
>>>
>>> ______________________________________________
>>> [hidden email] mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>
>> ______________________________________________
>> [hidden email] mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
>> ________________________________
>> View message @
>> http://r.789695.n4.nabble.com/forcing-evaluation-of-a-char-string-argument-tp3161365p3161542.html
>> To unsubscribe from forcing evaluation of a char string argument, click
>> here.
>
> -- 
> View this message in context: http://r.789695.n4.nabble.com/forcing-evaluation-of-a-char-string-argument-tp3161365p3161666.html
> Sent from the R help mailing list archive at Nabble.com.
>
> 	[[alternative HTML version deleted]]
>
>

Charles C. Berry                            Dept of Family/Preventive Medicine
cberry at tajo.ucsd.edu			    UC San Diego
http://famprevmed.ucsd.edu/faculty/cberry/  La Jolla, San Diego 92093-0901



More information about the R-help mailing list