[Rd] Set operation generics
Hadley Wickham
h.wickham at gmail.com
Tue Oct 22 16:54:57 CEST 2013
>> 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)
> 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?
Hadley
--
Chief Scientist, RStudio
http://had.co.nz/
More information about the R-devel
mailing list