[Rd] as.function()

Tony Plate tplate at acm.org
Mon Jan 14 19:05:28 CET 2008


How about this as a version  that automatically constructs the argument 
list (and make into a method for as.function as appropriate)?

makefun <- function(expr)
{
    f <- function() {}
    body(f) <- expr
    vars <- all.vars(expr)
    if (length(vars)) {
        args <- alist(x=)[rep(1,length(vars))]
        names(args) <- vars
        formals(f) <- args
    }
    environment(f) <- globalenv()
    return(f)
}

 > makefun(expression(2*x + 3*y^2))
function (x, y)
2 * x + 3 * y^2
 > makefun(expression(2*x + 3*y^2 - z))
function (x, y, z)
2 * x + 3 * y^2 - z
 > makefun(expression(p1 + p2))
function (p1, p2)
p1 + p2
 >

-- Tony Plate



Henrique Dallazuanna wrote:
> Try this:
>
> as.function.foo <- function(obj, ...)
> {
> newobj <- function(x, ...){}
> body(newobj) <- obj
> return(newobj)
> }
>
> x <- expression(2*x + 3*x^2)
>
> foo <- as.function.foo(x)
> foo(2)
>
>
> Hope this help
>
> On 14/01/2008, Robin Hankin <r.hankin at noc.soton.ac.uk> wrote:
>   
>> Antonio
>>
>>
>> thanks for your help here, but it doesn't answer my question.
>>
>> Perhaps if I outline my motivation it would help.
>>
>>
>> I want to recreate the ability of
>> the "polynom" package to do the following:
>>
>>
>>  > library(polynom)
>>  > p <- polynomial(1:4)
>>  > p
>> 1 + 2*x + 3*x^2 + 4*x^3
>>  > MySpecialFunction <- as.function(p)
>>  > MySpecialFunction(1:10)
>>   [1]   10   49  142  313  586  985 1534 2257 3178 4321
>>  > p <- 4
>>  > MySpecialFunction(1:10)
>>   [1]   10   49  142  313  586  985 1534 2257 3178 4321
>>  >
>>
>>
>> See how the user can define object "MySpecialFunction",
>>   which outlives short-lived polynomial "p".
>>
>> Unfortunately, I don't see a way to modify as.function.polynomial()
>> to do what I want.
>>
>>
>> best wishes
>>
>>
>> rksh
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> On 14 Jan 2008, at 08:45, Antonio, Fabio Di Narzo wrote:
>>
>>     
>>> 2008/1/14, Robin Hankin <r.hankin at noc.soton.ac.uk>:
>>>       
>>>> Hi
>>>>
>>>> [this after some considerable thought as to R-help vs R-devel]
>>>>
>>>>
>>>>
>>>> I want to write a (S3) method for as.function();
>>>> toy example follows.
>>>>
>>>> Given a matrix "a", I need to evaluate trace(ax) as a function of
>>>> (matrix) "x".
>>>>
>>>> Here's a trace function:
>>>>
>>>> tr <-  function (a)  {
>>>>     i <- seq_len(nrow(a))
>>>>     return(sum(a[cbind(i, i)]))
>>>> }
>>>>
>>>>
>>>> How do I accomplish the following:
>>>>
>>>>
>>>> a <- crossprod(matrix(rnorm(12),ncol=3))
>>>> class(a) <- "foo"
>>>>
>>>> f <- as.function(a)       # need help to write as.function.foo()
>>>> x <- diag(3)
>>>>
>>>> f(x)             #should give tr(ax)
>>>>         
>>> What about the following?
>>>
>>> as.function.foo <- function(a, ...)
>>>  function(x)
>>>    sum(diag(a*x))
>>>
>>> However, I don't see the need for an S3 method. Why don't simply use
>>> (?):
>>> mulTraceFun <- function(a)
>>>  function(x)
>>>   sum(diag(a*x))
>>>
>>> So you also have a more meaningful name than an anonymous
>>> 'as.function'.
>>>
>>> HTH,
>>> Antonio.
>>>
>>>       
>>>> a <- 4
>>>> f(x)           # should still give tr(ax) even though "a" has been
>>>> reassigned.
>>>>         
>>> This would'nt work with my proposal, because of lexical scoping.
>>>
>>>       
>>>>
>>>>
>>>>
>>>> [my real example is very much more complicated than this but
>>>> I need this toy one too and I can't see how to modify
>>>> as.function.polynomial()
>>>> to do what I want]
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Robin Hankin
>>>> Uncertainty Analyst and Neutral Theorist,
>>>> National Oceanography Centre, Southampton
>>>> European Way, Southampton SO14 3ZH, UK
>>>>  tel  023-8059-7743
>>>>
>>>> ______________________________________________
>>>> R-devel at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>
>>>>         
>>> --
>>> Antonio, Fabio Di Narzo
>>> Ph.D. student at
>>> Department of Statistical Sciences
>>> University of Bologna, Italy
>>>       
>> --
>> Robin Hankin
>> Uncertainty Analyst and Neutral Theorist,
>> National Oceanography Centre, Southampton
>> European Way, Southampton SO14 3ZH, UK
>>   tel  023-8059-7743
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>>     
>
>
>



More information about the R-devel mailing list