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 > -- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel