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([EMAIL PROTECTED])
+ range([EMAIL PROTECTED])
+ })
[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
<[EMAIL PROTECTED]> 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@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________
R-devel@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
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel