On 10/7/06, Gabor Grothendieck <[EMAIL PROTECTED]> wrote:
> I have noticed that dispatch on functions seems not to work
> in another case too.  We define + on functions (I have ignored
> the niceties of sorting out the environments as we don't really
> need it for this example) but when we try to use it, it fails even
> though in the second example if we run it explicitly it succeeds:
>
> > "+.function" <- function(x, y) function(z) x(z) + y(z)
> > sin+cos
> Error in sin + cos : non-numeric argument to binary operator
> > "+.function"(sin, cos)
> function(z) x(z) + y(z)
> <environment: 0x01c4ae7c>

I think that's because

> oldClass(sin)
NULL

?S3groupGeneric says:

     Note that a method will used for either one of these groups or one
     of its members _only_ if it corresponds to a '"class"' attribute,
     as the internal code dispatches on 'oldClass' and not on 'class'.
     This is for efficiency: having to dispatch on, say, 'Ops.integer'
     would be too slow.

To generalise your example,

Ops.function <-
    function (e1, e2 = NULL)
{
    FUN <-
        get(.Generic,
            envir = parent.frame(),
            mode = "function")
    ans <-
        function(x) {
            if (is.null(e2))
                "FUN"(e1(x))
            else
                "FUN"(e1(x),
                      if (is.function(e2)) e2(x)
                      else e2)
        }
    oldClass(ans) <- "function"
    ans
}

gives me:

> oldClass(sin) <- oldClass(cos) <- "function"
> (sin^2 + cos^2)(runif(10, 0, 2 * pi))
 [1] 1 1 1 1 1 1 1 1 1 1

I had expected the issue of environments to be non-trivial, but things
seem to magically [1] work out.

Deepayan


[1] http://www.quotationspage.com/quote/776.html

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to