Hi Hadley,
On 10/22/2013 07:54 AM, Hadley Wickham wrote:
Would anyone be interested in reviewing a patch to make the set
operations (union, intersect, setdiff, setequal, is.element) generic?
S3 generics, S4 generics, or primitives?
I would expect S3. Can you even have an S4 generic in the base
package? (i.e. before the methods package is loaded)
Probably not. But the patch could be trying to put them in stats4.
Note that all those things heavily rely on match() behind the scene.
If match() itself was an S4 generic (or a primitive like c() and [)
then union(), intersect(), setdiff(), is.element() could be defined
with something like:
union <- function(x, y)
{
xy <- c(x, y)
sm <- match(xy, xy)
xy[sm == seq_along(sm)]
}
intersect <- function(x, y)
{
sm <- match(x, x)
x <- x[sm == seq_along(sm)]
m <- match(x, y)
x[!is.na(m)]
}
setequal <- function(x, y)
{
!(anyNA(match(x, y)) || anyNA(match(x, y)))
}
Although I suspect R-core would prefer a minimal change where it's
easier to see that existing behaviour is preserved.
For the record, match(), union(), intersect(), and setdiff() are S4
generics in the BiocGenerics package. But there is no doubt it would
be a better/cleaner situation if base::match() itself was an S4 generic
or primitive.
By primitive, you mean internal generic?
Yes.
Thanks,
H.
Hadley
--
Hervé Pagès
Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024
E-mail: hpa...@fhcrc.org
Phone: (206) 667-5791
Fax: (206) 667-1319
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel