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