[Rd] as.function()
Duncan Murdoch
murdoch at stats.uwo.ca
Mon Jan 14 12:50:32 CET 2008
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
More information about the R-devel
mailing list