[R] Additional arguments in S3 method produces a warning

Philippe Grosjean phgrosjean at sciviews.org
Thu Mar 16 09:12:34 CET 2006


I totally agree with these considerations. However, there is another 
point to consider: any existing definition of a generic function.

At the time I programmed this in pastecs (first under S-PLUS), I found 
an already defined extract(e, n, ...) generic function. So, I decided to 
stick with the original definition, even if 'e' or 'n' did not mean 
anything special for my own use.

Ironically, doing a quick search on R, it appears that extract() is 
defined only in pastecs library...
Best,

Philippe Grosjean

Martin Maechler wrote:
>>>>>>"HenrikB" == Henrik Bengtsson <hb at maths.lth.se>
>>>>>>    on Thu, 16 Mar 2006 07:48:49 +0100 writes:
> 
> 
>     HenrikB> It is even better/more generic(!) to have: 
>     HenrikB> extract <- function(...) UseMethod("extract")
> 
>     HenrikB> "Specifying the object argument or the method
>     HenrikB> arguments of a generic function will restrict any
>     HenrikB> other methods with the same name to have the same
>     HenrikB> argument. By also excluding the object argument,
>     HenrikB> default functions such as search() will also be
>     HenrikB> called if the generic function is called without
>     HenrikB> any arguments."
>     HenrikB> [http://www.maths.lth.se/help/R/RCC/]
> 
>     HenrikB> /Henrik
> 
> Hmm, sorry, but that is Henrik's own ``style sheet'' which
> contains some views that I (and AFAIK other R-core members) 
> do not share.
> 
> The grain of truth in Henrik's statement is that for a generic
> function, S3 or S4, one should carefully consider which
> arguments should be shared by all methods and which not.
> But having at least one  `` non-... '' argument should be the
> rule, and is even a necessity for S4.
> Hence I'd strongly discourage defining generic functions with
> only a (...) argument list.
> 
>     HenrikB> On 3/15/06, Gabor Grothendieck
>     HenrikB> <ggrothendieck at gmail.com> wrote:
>     >> Define extract like this:
>     >> 
>     >> extract <- function(e, n, ...) UseMethod("extract")
>     >> 
>     >> # test -- no warning 
>     >> extract(tp, no.tp = FALSE, peak = TRUE, pit = FALSE)
> 
> yes, I agree with Gabor
> 
> Martin Maechler,
> ETH Zurich
> 
> 
>>On 3/15/06, Philippe Grosjean <phgrosjean at sciviews.org> wrote:
>>
>>>Hello,
>>>I just notice this:
>>> > x <- c(1:4,0:5, 4, 11)
>>> > library(pastecs)
>>>Loading required package: boot
>>> > tp <- turnpoints(x)
>>> > extract(tp, no.tp = FALSE, peak = TRUE, pit = FALSE)
>>> [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
>>>FALSE
>>>Warning message:
>>>arguments after the first two are ignored in: UseMethod("extract", e, n,
>>>...)
>>> > extract(tp)
>>> [1]  0  0  0  1 -1  0  0  0  0  1 -1  0
>>>Warning message:
>>>arguments after the first two are ignored in: UseMethod("extract", e, n,
>>>...)
>>>
>>>My extract.turnpoints() function produces warnings. I can easily spot
>>>the origin of this warning:
>>>
>>> > extract
>>>function (e, n, ...)
>>>UseMethod("extract", e, n, ...)
>>> > extract.turnpoints
>>>function (e, n, no.tp = 0, peak = 1, pit = -1, ...)
>>>{
>>>    if (missing(n))
>>>        n <- length(e)
>>>    res <- rep(no.tp, length.out = e$n)
>>>    res[e$pos[e$peaks]] <- peak
>>>    res[e$pos[e$pits]] <- pit
>>>    if (n < length(res) & n > 0)
>>>        res <- res[1:n]
>>>    res
>>>}
>>>
>>>This is because my extract.turnpoints() method defines more arguments
>>>than 'e' and 'n' in the generic function. However,
>>>
>>>1) I though that the '...' argument in S3 generic function was there to
>>>allow defining/passing additional arguments in/to S3 methods. Is this
>>>correct? If yes, why the warning?
>>>
>>>2) Despite the warning says arguments after the first two are ignored,
>>>this appears not to be the case: in this example, 'no.tp', 'peak' and
>>>'pit' arguments are taken into account, as you can see (different
>>>behaviour if you give other values to them).
>>>
>>>I am a little bit lost. Could someone help me, please.
>>>
>>>Best,
>>>
>>>Philippe Grosjean
>>>
> 
> 
>




More information about the R-help mailing list