[Bioc-devel] error when combining objects inheriting from GRangesList

Leonard Goldstein goldstein.leonard at gene.com
Fri Dec 4 19:51:36 CET 2015


Hi Hervé,

OK thanks for the workaround and the quick reply.

Best wishes,

Leonard


On Fri, Dec 4, 2015 at 10:41 AM, Hervé Pagès <hpages at fredhutch.org> wrote:
> Hi Leonard,
>
>
> On 12/04/2015 09:43 AM, Leonard Goldstein wrote:
>>
>> Hi all,
>>
>> In the latest Bioc release (and devel) I encountered problems with
>> classes inheriting from GRangesList. Combining two or more objects
>> that belong to such classes can result in an error, as the combined
>> object is apparently not recognized as a valid instance of the class.
>> I included an example below. Thanks in advance for your help.
>>
>> Leonard
>>
>> --
>>>
>>> library(GenomicRanges)
>>>
>>> validNewClass <- function(object) {
>>
>> +
>> +   if (!"ID" %in% names(mcols(object))) {
>> +
>> +     return("missing metadata column ID")
>> +
>> +   }
>> +
>> + }
>>>
>>>
>>> setClass(
>>
>> +   Class = "newClass",
>> +   contains = "GRangesList",
>> +   validity = validNewClass)
>>>
>>>
>>> gr <- GRanges(1, IRanges(1, 100))
>>> grl <- split(gr, 1)
>>> mcols(grl)$ID <- 1
>>> x <- new("newClass", grl)
>>>
>>> ## combining two instances of newClass results in an error
>>> c(x, x)
>>
>> Error in validObject(.Object) :
>>    invalid class “newClass” object: missing metadata column ID
>
>
> A lot of code in the S4Vectors/IRanges/GenomicRanges infrastructure
> needs to create temporarily invalid objects for various reasons. At
> the lowest level we use S4Vectors::new2(..., check=FALSE) for that.
> Unlike methods::new(), which always validates the new object, new2()
> only validates it if 'check' is set to TRUE.
> However new2() is only able to to this if the validity method for the
> object was defined using setValidity2(), also defined in the S4Vectors
> package. If you build on top of the S4Vectors/IRanges/GenomicRanges
> infrastructure, please always use setValidity2():
>
>   library(GenomicRanges)
>
>   setClass("newClass", "GRangesList")
>
>   setValidity2("newClass",
>     function(object) {
>       if (!("ID" %in% names(mcols(object))))
>         return("missing metadata column ID")
>       NULL
>     }
>   )
>
>   gr <- GRanges("1:1-100")
>   grl <- split(gr, 1)
>   mcols(grl)$ID <- 1
>   x <- new("newClass", grl)
>
> Then:
>
>   > c(x, x)
>
>   newClass object of length 2:
>   $1
>   GRanges object with 1 range and 0 metadata columns:
>         seqnames    ranges strand
>            <Rle> <IRanges>  <Rle>
>     [1]     1  [   1, 100]      *
>
>   $1
>   GRanges object with 1 range and 0 metadata columns:
>         seqnames    ranges strand
>     [1]        1 [ 1, 100]      *
>
>   -------
>   seqinfo: 1 sequence from an unspecified genome; no seqlengths
>
>>>
>>> ## but can create an instance after combining as GRangesLists
>>> new("newClass", c(as(x, "GRangesList"), as(x, "GRangesList")))
>>
>> newClass object of length 2:
>> $1
>> GRanges object with 1 range and 0 metadata columns:
>>        seqnames    ranges strand
>>           <Rle> <IRanges>  <Rle>
>>    [1]        1  [1, 100]      *
>>
>> $1
>> GRanges object with 1 range and 0 metadata columns:
>>        seqnames   ranges strand
>>    [1]        1 [1, 100]      *
>>
>> -------
>> seqinfo: 1 sequence from an unspecified genome; no seqlengths
>
>
> This works because the validity method for GRangesList objects is set
> with setValidity2().
>
> I wish new() had the extra 'check' argument so we wouldn't need to use
> the new2/setValidity2 hack.
>
> Hope this helps,
> H.
>
>>>
>>> sessionInfo()
>>
>> R version 3.2.2 (2015-08-14)
>> Platform: x86_64-pc-linux-gnu (64-bit)
>> Running under: Red Hat Enterprise Linux Server release 6.6 (Santiago)
>>
>> locale:
>>   [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
>>   [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
>>   [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
>>   [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
>>   [9] LC_ADDRESS=C               LC_TELEPHONE=C
>> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
>>
>> attached base packages:
>> [1] stats4    parallel  stats     graphics  grDevices utils     datasets
>> [8] methods   base
>>
>> other attached packages:
>> [1] GenomicRanges_1.22.1 GenomeInfoDb_1.6.1   IRanges_2.4.4
>> [4] S4Vectors_0.8.3      BiocGenerics_0.16.1
>>
>> loaded via a namespace (and not attached):
>> [1] zlibbioc_1.16.0 XVector_0.10.0
>>>
>>>
>>
>> _______________________________________________
>> 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 fredhutch.org
> Phone:  (206) 667-5791
> Fax:    (206) 667-1319



More information about the Bioc-devel mailing list