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) a <- 4 f(x) # should still give tr(ax) even though "a" has been reassigned. [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
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 wrote:> 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) > > a <- 4 > f(x) # should still give tr(ax) even though "a" has been > reassigned. > >Brian's answer was what you want. A less general version is this: > as.function.foo <- function(x, ...) { + function(b) tr(x %*% b) + } (I switched the names of the args, because the first arg to as.function.foo should match the name of the first arg to as.function). I was a little surprised that this worked even if a was changed without ever evaluating f, because I thought lazy evaluation would mess up that case. But of course the value of x is forced when R evaluates it to find out the class for dispatch to the method. Duncan Murdoch