[Rd] Set operation generics
Hervé Pagès
hpages at fhcrc.org
Tue Oct 22 18:52:21 CEST 2013
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: hpages at fhcrc.org
Phone: (206) 667-5791
Fax: (206) 667-1319
More information about the R-devel
mailing list