[R] Method dispatch for function call operator?

Duncan Murdoch murdoch.duncan at gmail.com
Thu Jan 13 11:07:16 CET 2011

On 11-01-13 3:09 AM, Taras Zakharko wrote:
> Dear R gurus,
>   I am trying to create a nicer API interface for some R modules I have
> written. Here, I heavily rely on S3 method dispatch mechanics and
> makeActiveBinding()  function
>   I have discovered that I apparently can't dispatch on function call
> operator (). While .Primitive("(") exists, which leads me to believe that
> things like x(...) are internally translated to .Primitive("(")(x, ...), I
> can't seem to do something like:

The "(" function is not a function call operator.  It's essentially a 
no-op.  I believe its only purpose is to help in deparsing, so that 
things like (x + y) would deparse in the same way as entered.

> x<- integer()
> class(x)<- "testclass"
> "(.testclass"<- function(o, x, y) print(paste(x, y))
> x(1, 2)
> Similar code does work for other operators like "[".
> A workaround I have discovered is to make x a function from the beginning
> and then extend the functionality by via S3 methods. Unfortunately, it does
> not allow me to do something I'd really like to - use syntax like this:
> x(...)<- y

You can use this syntax by defining a function `x<-` <- function(...) {}
and it could be an S3 method, but it is a completely separate object from x.

Duncan Murdoch

> For this, I'd need to dispatch on something like
> "(<-.testclass"<- function(x, arglist, value)
> Currently, I am using the index operator for this (i.e. x[...]<- y) - it
> works nicely, but I'd prefer the () syntax, if possible.
>   Does anyone know a way to do this?

More information about the R-help mailing list