[BioC] IRanges : Strange behavior subsetting an IntervalTree with an indexing variable from within a function

Patrick Aboyoun paboyoun at fhcrc.org
Wed Sep 9 21:10:18 CEST 2009


Steve,
Thanks for uncovering this issue. I have checked in a BioC 2.5 fix to 
the method along the lines you have stated:

setMethod("[", "Ranges",
    function(x, i, j, ..., drop)
    {
        cl <- class(x)
        mc <- match.call()
        mc$x <- as(x, "IRanges")
        as(eval(mc, parent.frame()), cl)
    }
)

This wasn't my code, but I would guess the author tried more robust 
alternatives (e.g. callGeneric()) to hand manipulating the function 
call, but was stymied by "[" being a privative method. The fix can be 
retrieved by svn now or by biocLite after tomorrow's build finishes.


Patrick



Steve Lianoglou wrote:
> Hi,
>
> On Sep 9, 2009, at 2:12 PM, Martin Morgan wrote:
>
>> Hi Steve -- I suspect the developer will get to this shortly, and that
>> this has to do with internal issues in R. So your best bet is to give it
>> a break for a couple of hours.
>>
>> In the mean time, you can find out what's going on with
>>
>>> selectMethod("[", "IntervalTree")
>
> Hah ... wow, need to learn S4 ... I (dumbly) thought it was using the 
> '[' defined for IRanges classes, even though inherits(myIntervalTree, 
> 'IRanges') is FALSE ...
>
>> Method Definition:
>>
>> function (x, i, j, ..., drop = TRUE)
>> {
>>    cl <- class(x)
>>    mc <- match.call()
>>    mc$x <- as(x, "IRanges")
>>    as(eval(mc), cl)
>> }
>> <environment: namespace:IRanges>
>>
>> Signatures:
>>        x              i     j
>> target  "IntervalTree" "ANY" "ANY"
>> defined "Ranges"       "ANY" "ANY"
>>> trace("[", signature="IntervalTree", tracer=browser)
>> Tracing specified method for function "[" in package "base"
>> [1] "["
>>>       query <- IRanges(c(1, 4, 9), c(5, 7, 10))
>>>       subject <- IRanges(c(2, 2, 10), c(2, 3, 12))
>>>       tree <- IntervalTree(subject)
>>> tree[1:2]
>> Tracing tree[1:2] on entry
>> Called from: eval(expr, envir, enclos)
>> Browse[1]> n
>>
>> my guess is that 'eval' is in the wrong frame, probably because of the
>> way the methods package manipulates things. I'm not sure why
>> "[",IntervalTree was implemented this way.
>
> Indeed!
>
> Anyway, from your hint I found the appropriate function (notice the 
> fixme note :-) in Ranges-class.R:
>
> ### FIXME: hopefully temporary
> setMethod("[", "Ranges",
>     function(x, i, j, ..., drop)
>     {
>         cl <- class(x)
>         mc <- match.call()
>         mc$x <- as(x, "IRanges")
>         as(eval(mc), cl)
>     }
> )
>
> in Ranges-class.R
>
> I tweaked it to capture the parent.frame and now it works:
>
> setMethod("[", "Ranges",
>     function(x, i, j, ..., drop)
>     {
>         cl <- class(x)
>         mc <- match.call()
>         pf <- parent.frame()
>         mc$x <- as(x, "IRanges")
>         as(eval(mc, pf), cl)
>     }
> )
>
> It seems that the match.call is taking the name of my the variable I'm 
> passing into the argument as i, instead of using ``i`` itself, for 
> instance, using your example.
>
> R> idx <- 1:2
> R> tree[idx]
>
> Looking at the value of mc, we see:
>
> debug: mc$x <- as(x, "IRanges")
> Browse[2]> mc
> the.tree[i = idx]
>
> So ... sending the parent.frame allows the eval to see the appropriate 
> idx var.
>
> I'm not sure if that's the fix you should use, but it seems to be 
> working atm.
>
> Thanks for the heads up,
> -steve
>
> -- 
> Steve Lianoglou
> Graduate Student: Computational Systems Biology
>   |  Memorial Sloan-Kettering Cancer Center
>   |  Weill Medical College of Cornell University
> Contact Info: http://cbio.mskcc.org/~lianos/contact
>
> _______________________________________________
> Bioconductor mailing list
> Bioconductor at stat.math.ethz.ch
> https://stat.ethz.ch/mailman/listinfo/bioconductor
> Search the archives: 
> http://news.gmane.org/gmane.science.biology.informatics.conductor



More information about the Bioconductor mailing list