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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]>: >>> >>>> 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@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@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> >> > > > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel