From maechler at stat.math.ethz.ch  Thu Mar  4 09:26:26 2010
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Thu, 4 Mar 2010 09:26:26 +0100
Subject: [Rd] dots for sample --> "implicitGeneric"
In-Reply-To: <4B8AB68E.2090404@units.it>
References: <4B8AB68E.2090404@units.it>
Message-ID: <19343.28338.343700.941713@lynne.math.ethz.ch>

>>>>> "CB" == Claudia Beleites <cbeleites at units.it>
>>>>>     on Sun, 28 Feb 2010 19:31:42 +0100 writes:

    CB> Dear R-Developers,
    CB> could 'sample' gain a ... argument?

As you may know, adding '...' also has drawbacks,
most notably that you lose automatic checking of correctly
specified argument names (when the function is called).

OTOH, R has now (since 2.9.0)  had sample.int() as a fast and "robust"
alternative.

    CB> As a convenience function, I added a sample Method to my hyperSpec 
    CB> class. This function however has a flag indicating whether the results 
    CB> should be returned directly as a hyperSpec object or rather as indices 
    CB> that give a random sample.

    CB> For the moment, I use SetGeneric to add the dots argument, but this of 
    CB> course gives a warning that the base function sample is overwritten (and 
    CB> my colleagues are almost as scared of warnings as of errors...)

and they are not the only ones ... 

For a while now, we have (in 'methods') the possibility to make
functions "implicit generic",  see  ?implicitGeneric ,
exactly for purposes like (I think)  you have here
( and notably to ensure that if *different* packages do this,
  they get "compatible" versions of the generic,
  and hence all the different method definitions will be
  "attached" to the same generic )

Namely, you'd want to define S4 methods (and hence make 'sample' an S4 generic)
with "new" arguments in your package.

So, yes, I now have added 'sample' to the list of functions
that we make implicitGeneric in R.
--> Get a version of R-devel, (svn revision >= 51202)
and try the following:

> setClass("foo", contains="vector")
[1] "foo"

> setMethod("sample", "foo", function(x, size, myArg, ...) sprintf("sample(<foo>, myArg=%s)\n",myArg))
Restoring the implicit generic function for ?sample? from package ?base?
    into package ?.GlobalEnv?; the generic differs from the default conversion (Formal arguments differ: (x, size, replace, prob), (x, size, replace, prob, ...))
Creating a new generic function for "sample" in ".GlobalEnv"
[1] "sample"

> sample(new("foo"), myArg = 64)
[1] "sample(<foo>, myArg=64)\n"


Best regards,
Martin Maechler, ETH Zurich


    CB> Thanks,
    CB> Claudia

    CB> -- 
    CB> Claudia Beleites
    CB> Dipartimento dei Materiali e delle Risorse Naturali
    CB> Universit? degli Studi di Trieste
    CB> Via Valerio 2
    CB> I-34127 Trieste
    CB> ITALY



[Rd] dots for sample --> "implicitGeneric"
Martin Maechler