[Bioc-devel] Changes in the %in% function for DNAStringSet?
Nicolas Delhomme
delhomme at embl.de
Fri May 4 09:31:40 CEST 2012
Hi Hervé,
Thanks a lot for fixing it and for the super detailed description! Learned a lot :-) And thanks for the benchmarking, that's really useful as well!
I can't really think of any drawbacks there, but my %in% usage is certainly limited. What do the R developer guys say about it? Wouldn't it make sense to have it that way in base R?
Cheers,
Nico
On May 4, 2012, at 3:56 AM, Hervé Pagès wrote:
> Hi Nico,
>
> Last week I did some improvements/reorganization of the match(),
> %in%, duplicated(), and unique() stuff in IRanges/GenomicRanges/Biostrings, and apparently forgot to define the "%in%" method
> for ANY,Vector. Thanks for the catch!
>
> This is fixed in IRanges 1.15.8. FWIW I also added an "%in%" method
> for Vector,ANY so now this works too:
>
> > DNAStringSet(c("TTGCGA","ATGRCT","ACASTG")) %in% c("TTGCGA","ATGGCT","ACACTG")
> [1] TRUE FALSE FALSE
>
> <rant mode>
>
> It is so sad that we have to redefine "%in%" methods that do exactly
> the same thing as base::`%in%`:
>
> > base::`%in%`
> function (x, table)
> match(x, table, nomatch = 0L) > 0L
> <environment: namespace:base>
>
> just because base::`%in%` cannot dispatch on the appropriate
> "match" method. A well-known issue of the way generics, methods
> and NAMESPACE interact with each other... but still an unfortunate
> one.
>
> </rant mode>
>
> The good news is that we have on our TODO list to explicitly define
> the match() and %in% generics in BiocGenerics so there will be an
> opportunity to overwrite the "%in%" default method:
>
> setMethod("%in%", c("ANY", "ANY"), function (x, table) match(x, table, nomatch = 0L) > 0L)
>
> (I'm still hesitant about this though. What could be the drawbacks
> of overwriting the default method?)
>
> Also last week at the same time I did the changes on match() and
> family, I also reimplemented the "match" method for DNAStringSet
> objects (which is called when either 'x' or 'table' or both are
> DNAStringSet). The new implementation is in Biostrings 2.25.3.
> It uses a hash-based algorithm instead of the quicksort-based algo
> that was used so far. The resulting speedup varies a lot depending
> on the sizes of 'x' and 'table', and will typically be important
> (10x or more) for big (i.e. > 1M elements) DNAStringSet objects.
>
> This benefits directly %in%, duplicated() and unique() on
> DNAStringSet objects.
>
> With Biostrings 2.25.3 (Bioc 2.11):
>
> > library(Biostrings)
> > probes <- DNAStringSet(hgu133aprobe)
> > system.time(isdup <- duplicated(probes))
> user system elapsed
> 0.048 0.000 0.050
>
> With Bioc <= 2.10:
>
> > system.time(isdup <- duplicated(probes))
> user system elapsed
> 0.232 0.000 0.233
>
> Finally I should mention that, even though the hash function I use
> for DNAStringSet (and RNAStringSet, AAStringSet, BStringSet) is the
> same as the function used in base R for hashing the strings of a
> standard character vector, calling match(), %in%, duplicated() or
> unique() on a standard character vector is still slightly faster
> (2x) than on a DNAStringSet. This can probably be explained by the
> fact that all the strings in all the character vectors defined in
> a session are pre-hashed i.e. hashed the 1st time the string is
> created and the result of the hash stored in the "global CHARSXP
> hash table".
>
> Cheers,
> H.
>
> On 05/01/2012 05:28 AM, Nicolas Delhomme wrote:
>> Hi all,
>>
>> In R 2.15.0, Bioc 2.10, the following works:
>>
>> library(Biostrings)
>> c("TTGCGA","ATGGCT","ACACTG") %in% DNAStringSet(c("TTGCGA","ATGRCT","ACASTG"))
>> [1] TRUE FALSE FALSE
>>> sessionInfo()R version 2.15.0 (2012-03-30)
>> Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
>>
>> locale:
>> [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
>>
>> attached base packages:
>> [1] stats graphics grDevices utils datasets methods base
>>
>> other attached packages:
>> [1] Biostrings_2.24.1 IRanges_1.14.2 BiocGenerics_0.2.0
>>
>> loaded via a namespace (and not attached):
>> [1] stats4_2.15.0
>>
>>
>> While in Bioc 2.11 it fails:
>>
>> Error in match(x, table, nomatch = 0L) :
>> 'match' requires vector arguments
>>> sessionInfo()
>> R version 2.15.0 (2012-03-30)
>> Platform: x86_64-apple-darwin10.8.0 (64-bit)
>>
>> locale:
>> [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
>>
>> attached base packages:
>> [1] stats graphics grDevices utils datasets methods base
>>
>> other attached packages:
>> [1] Biostrings_2.25.3 IRanges_1.15.7 BiocGenerics_0.3.0
>>
>> loaded via a namespace (and not attached):
>> [1] stats4_2.15.0
>>
>>
>>
>> I'd just like to know if that is that a change of API or not. If yes, I'd need to adapt my code that currently fails building.
>>
>> Cheers,
>>
>> Nico
>>
>> ---------------------------------------------------------------
>> Nicolas Delhomme
>>
>> Genome Biology Computational Support
>>
>> European Molecular Biology Laboratory
>>
>> Tel: +49 6221 387 8310
>> Email: nicolas.delhomme at embl.de
>> Meyerhofstrasse 1 - Postfach 10.2209
>> 69102 Heidelberg, Germany
>>
>> _______________________________________________
>> Bioc-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>
>
> --
> 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
---------------------------------------------------------------
Nicolas Delhomme
Genome Biology Computational Support
European Molecular Biology Laboratory
Tel: +49 6221 387 8310
Email: nicolas.delhomme at embl.de
Meyerhofstrasse 1 - Postfach 10.2209
69102 Heidelberg, Germany
More information about the Bioc-devel
mailing list