[Bioc-devel] class name collision in cache: igvR and Gviz

Paul Shannon p@ul@thurmond@@h@nnon @ending from gm@il@com
Wed May 9 17:56:29 CEST 2018


Hi Michael,

Thank you for this work and the explanation.  It’s good to know that my problem will feed back into improvements in the methods package.

I opted for a simpler workaround, for now, renaming my abstract class to avoid the collision.  

 - Paul

> On May 8, 2018, at 8:25 AM, Michael Lawrence <lawrence.michael at gene.com> wrote:
> 
> Thanks Paul.
> 
> I've made improvements to the methods package so that there will no longer be any messages about AnnotationTrack being duplicated, but I'll need to work through some failures this is causing in tests.
> 
> The first issue is interesting though. Since Gviz defines an initialize() for AnnotationTrack, dispatch ends up using that intsead of the default. That method (incorrectly in my opinion) silently drops unrecognized arguments in "..." so it is effectively a no-op. Ideally the method would eventually call callNextMethod(). Not doing so makes assumptions about how the parent object is initialized. It would also make this case work, just by luck. This is one reason why defining initialize() methods is tricky and should be avoided.
> 
> Unfortunately, the methods package will dispatch to a method, regardless of the package of origin, unless there are methods with signatures containing two or more classes of the same name.  This might be easy to fix but there could be performance regressions. This problem will happen all the time if there are initialize() methods around. You should be able to avoid this just by defining your own initialize() method that just calls the next method. Ideally though Gviz would just drop its one.
> 
> Michael
> 
> On Mon, May 7, 2018 at 11:14 AM, Paul Shannon <paul.thurmond.shannon at gmail.com> wrote:
> Hi Michael,
> 
> > On May 4, 2018, at 1:36 PM, Michael Lawrence <lawrence.michael at gene.com> wrote:
> > 
> > Do you have a reproducible example of this? It's probably a bug in the methods package.
> > 
> 
> Sorry I did not get to this sooner.  Here are two symptoms of the cache class name collision:
> 
>    1) igvR::displayTrack, if called after motifbreakR::plotMB, fails (see error message below)
>    2) plotMB, if called after igvR is loaded, reports the class name collision.
> 
> - Paul
> 
> library(SNPlocs.Hsapiens.dbSNP150.GRCh38)
> library(BSgenome.Hsapiens.UCSC.hg38)
> library(motifbreakR)
> 
> snp <- "rs12050029"
> 
> snps.gr <- snps.from.rsid(rsid = snp,
>                           dbSNP=SNPlocs.Hsapiens.dbSNP150.GRCh38,
>                           search.genome=BSgenome.Hsapiens.UCSC.hg38)
> 
> 
> results <- motifbreakR(snpList = snps.gr, filterp = TRUE,
>                        pwmList = query(MotifDb, "jaspar2018"),
>                        threshold = 1e-4,
>                        method = "ic",
>                        bkg = c(A=0.25, C=0.25, G=0.25, T=0.25),
>                        BPPARAM = BiocParallel::bpparam("SerialParam"))
> 
> plotMB(results = results, rsid = snp, effect = c("weak", "strong"))
> 
> 
> library(igvR)
> igv <- igvR()
> setGenome(igv, "hg38")
> snp.track <- GRangesAnnotationTrack("snp", snps.gr, color="red")
> displayTrack(igv, snp.track)
> 
>    # this error is only seen if motifbreakR - and thus Gviz - have been loaded
>    # otherwise, displayTrack works fine
>    # Error in if (trackType == "variant" && source == "file" && fileFormat ==  :
>    #  missing value where TRUE/FALSE
> 
> plotMB(results = results, rsid = snp, effect = c("weak", "strong"))
> 
>    # Found more than one class "AnnotationTrack" in cache; using the first, from namespace 'Gviz'
>    # Also defined by 'igvR'
>    # Found more than one class "AnnotationTrack" in cache; using the first, from namespace 'Gviz'
>    # Also defined by 'igvR'
>    # Found more than one class "AnnotationTrack" in cache; using the first, from namespace 'Gviz'
>    # Also defined by 'igvR'
>    # Found more than one class "AnnotationTrack" in cache; using the first, from namespace 'Gviz'
>    # Also defined by 'igvR'
>    # Found more than one class "AnnotationTrack" in cache; using the first, from namespace 'Gviz'
>    # Also defined by 'igvR'
>    # Found more than one class "AnnotationTrack" in cache; using the first, from namespace 'Gviz'
>    # Also defined by 'igvR'
> 
> 
> 
> 
> 
> > Michael
> > 
> > On Fri, May 4, 2018 at 10:52 AM, Paul Shannon <paul.thurmond.shannon at gmail.com> wrote:
> > I just discovered a class name collision - AnnotationTrack, in Gviz and my new package igvR.   wish to get wise counsel before proceeding with a fix.  Here’s the error message:
> > 
> >    Found more than one class "AnnotationTrack" in cache; 
> >    using the first, from namespace ‘igvR' Also defined by ‘Gviz’
> > 
> > AnnotationTrack is an abstract base class in my new package igvR.  The concrete derived classes at present are
> > 
> >   DataFrameAnnotationTrack
> >   GRangesAnnotationTrack
> >   UCSCBedAnnotationTrack
> > 
> > It would be easy for me to rename AnnotationTrack to “GenomeAnnotationTrack” or even “igvAnnotationTrack”, thereby  avoiding the name clash.  
> > 
> > Reasonable?  Fix in both release and devel?
> > 
> > Thanks -
> > 
> >  - Paul
> > 
> > _______________________________________________
> > Bioc-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/bioc-devel
> > 
> > 
> 
> 
> 



More information about the Bioc-devel mailing list