On Mon, 14 Jan 2008, 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)
Well, that copies what as.function.polynomial did but that was written for S3 well before R was started. Here you can use environments: as.function.foo <- function(obj, ...) function(x, ...) eval(obj) > > > 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 >> > > > -- Brian D. Ripley, [EMAIL PROTECTED] Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel