From osklyar at ebi.ac.uk  Tue May 27 21:18:15 2008
From: osklyar at ebi.ac.uk (Oleg Sklyar)
Date: Tue, 27 May 2008 20:18:15 +0100
Subject: [Rd] S4 generic for lowess
In-Reply-To: <483B3698.30808@gmail.com>
References: <48328EB8.7050001@gmail.com>	<59d7961d0805201006m4c6b1dd0i9422ec31f8810c01@mail.gmail.com>
	<483B3698.30808@gmail.com>
Message-ID: <483C5E77.5090205@ebi.ac.uk>

One can redefine range and similar ones (c, cbind, rbind etc) as S4 methods:

:: R version 2.8.0 Under development (unstable) (2008-04-22 r45454)
 > setGeneric("range")
[1] "range"
 > setClass("MyClass", representation("numeric",comment="character"))
[1] "MyClass"
 > setMethod("range", "MyClass", function(x, ..., na.rm = FALSE) {
+ print(x at comment)
+ range(x at .Data)
+ })
[1] "range"
 > a = new("MyClass", runif(5,1,25), comment="Hello world")
 > range(a)
[1] "Hello world"
[1]  4.953273 21.792185

This is a trivial example, but handling of ... in the function body is 
also possible thus making it less trivial in general.

Best,
Oleg

Iago Mosqueira wrote:
> Hi,
> 
> Henrik Bengtsson wrote:
>> A quick comment on design:
>>
>> On Tue, May 20, 2008 at 1:41 AM, Iago Mosqueira
>> <iago.mosqueira at gmail.com> wrote:
>>> Hi,
>>>
>>> A lowess method is defined in our package for one of our S4 classes. To
>>> explicitely define the generic this is being used
>>>
>>> if (!isGeneric("lowess"))
>>>  setGeneric("lowess", useAsDefault = lowess)
>>>
>>> This works fine for many other methods inherited from various R
>>> packages. In this case a warning is issued in R CMD check:
>>>
>>> * checking R code for possible problems ... NOTE
>>> lowess: no visible binding for global variable 'xy'
>>> lowess: no visible binding for global variable 'o'
>>>
>>> which I assume originates from the formals of lowess
>>>
>>> lowess(x, y = NULL, f = 2/3, iter = 3, delta = 0.01 * diff(range(xy$x[o])))
>>>
>>> where 'xy' and 'o' are present in the argument list but are really
>>> defined inside the function itself.
>> To my opinion, this could have been implemented as (or with some other
>> default value on 'delta'):
>>
>> lowess <- function(x, y=NULL, f=2/3, iter=3, delta=NULL) {
>>   [...]
>>   if (is.null(delta))
>>     delta <- 0.01 * diff(range(xy$x[o])));
>>   [...]
>> }
>>
>> and then document in the help pages what 'delta' defaults to.
>>
>> My $.02
>>
>> /Henrik
> 
> That would be extremely useful for our code. I have some other examples
> of functions or S3 methods that could benefit from changes in default
> arguments to make them more S4 friendly. range, for example, cannot be
> overload as its generic needs to be based on
> 
> function (..., na.rm = FALSE)  .Primitive("range"
> 
> Is there interest in the R Core Team in identifying these?
> 
> Regards,
> 
> 
> Iago
> 
> 
> 
>>> I suppose I can safely ignore this warning, and the new methods seems to
>>> work fine, but I was curious to know if there is a better way to deal
>>> with this.
>>>
>>> Many thanks,
>>>
>>>
>>> Iago
>>>
>>> --
>>> Iago Mosqueira
>>> Cefas
>>> Systems Modelling
>>>
>>> Pakefield Rd.
>>> Lowestoft NR33 0HT
>>> U.K.
>>> +44 (0)1502 558003
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Dr Oleg Sklyar * EBI-EMBL, Cambridge CB10 1SD, UK * +44-1223-494466



[Rd] S4 generic for lowess
Oleg Sklyar