On 10/21/2015 03:36 PM, Michael Lawrence wrote:
That sucks. I was thinking we could easily make R smarter about
sub-assignment, so that base::ifelse would just work with value Rle, as
would [<- in general. The C code would just call as.vector() on the
object. The problem is that S4 objects are seen by that code as "scalar"
and are wrapped in a list when sub-assigned into one:

 > l <- list()
 > l[1] <- Rle(3:1)
 > l
[[1]]
integer-Rle of length 3 with 3 runs
   Lengths: 1 1 1
   Values : 3 2 1

But that behavior is inconsistent within the base package, because
lapply(), mapply() etc assume an S4 object is vector-like. I'm
interested in your opinion. Should we deprecate the list sub-assignment
behavior?

I think list sub-assignment should just call as.list() on the right
value if the value is not already a list. That way base R doesn't have
to choose whether S4 objects should be seen as "scalar" or as
"vector-like". This decision is now in the hands of the author of the
S4 class: if s/he chooses to have the "as.list" method for his/her
objects to just wrap the object in a list then s/he'll get the current
behavior (object treated as a scalar). If s/he chooses to have the
"as.list" method return a list parallel to the object then s/he'll get
list sub-assignment treat his/her objects as vector-like.

This principle can be extended to sub-assignments in general, not just
list sub-assignments: if the class of the right value in 'x[i] <- value'
doesn't extend the class of 'x', then 'value' should first be coerced
to the class of 'x':

  if (!is(value, class(x))
    value <- as(value, class(x))

Note that this is what the "[<-" method for Vector objects (defined
in S4Vectors) does (thru the default method for normalizeSingleBracketReplacementValue).

Thanks,
H.


Michael


On Wed, Oct 21, 2015 at 11:14 AM, Hervé Pagès <hpa...@fredhutch.org
<mailto:hpa...@fredhutch.org>> wrote:

    Hi Michael,

    On 10/21/2015 07:09 AM, Michael Lawrence wrote:

        News to me. Why was this deprecated? Why can't the ifelse()
        method just do
        what it is now telling the user to do? Is it to make the
        inefficiency of
        the implementation more obvious?


    There was some discussion about this here:

    https://support.bioconductor.org/p/70871/

    I should probably have brought this to bioc-devel before making that
    change, sorry. I'll be happy to bring these methods back if there is a
    way to preserve the semantic of base::ifelse() (which relies on delayed
    evaluation of the 'yes' and 'no' arguments).

    H.

        The goal with Rle was to make it behave as
        conveniently and as vector-like as possible.



        On Wed, Oct 21, 2015 at 6:50 AM, Robert Castelo
        <robert.cast...@upf.edu <mailto:robert.cast...@upf.edu>>
        wrote:

            hi,

            one of the recent changes in the devel IRanges has been to
            defunct the
            'ifelse' method for 'Rle' objects. This was warned during
            the previous
            devel cycle and so it does with current release.

            One of the affected functions is the VRanges object constructor,
            'VRanges()'. Since I use this function within my package
            VariantFiltering,
            this is now precluding it to build.

            I would like to ask whether you could fix the VRanges
            constructor to
            comply with the new requirement on the 'ifelse' method for
            'Rle' objects.

            please find below a reproducible example for release and
            devel with
            corresponding session information.

            thanks!!

            robert.

            ============================================

            This is what happens in current release:

            library(VariantAnnotation)


            VRanges()
            VRanges object with 0 ranges and 0 metadata columns:
                 seqnames    ranges strand         ref              alt
            totalDepth
               refDepth       altDepth   sampleNames softFilterMatrix
                    <Rle> <IRanges>  <Rle> <character> <characterOrRle>
            <integerOrRle>
            <integerOrRle> <integerOrRle> <factorOrRle>         <matrix>
                -------
                seqinfo: no sequences
                hardFilters: NULL
            Warning messages:
            1:   The "ifelse" methods for Rle objects are deprecated.
            Please use

                    as(ifelse(test, as.vector(yes), as.vector(no)), "Rle")

                instead.
            2:   The "ifelse" methods for Rle objects are deprecated.
            Please use

                    as(ifelse(test, as.vector(yes), as.vector(no)), "Rle")

                instead.

            sessionInfo()
            R version 3.2.2 (2015-08-14)
            Platform: x86_64-pc-linux-gnu (64-bit)
            Running under: Fedora release 12 (Constantine)

            locale:
               [1] LC_CTYPE=en_US.UTF8       LC_NUMERIC=C LC_TIME=en_US.UTF8
            LC_COLLATE=en_US.UTF8 LC_MONETARY=en_US.UTF8
               [6] LC_MESSAGES=en_US.UTF8    LC_PAPER=en_US.UTF8
              LC_NAME=C
                   LC_ADDRESS=C              LC_TELEPHONE=C
            [11] LC_MEASUREMENT=en_US.UTF8 LC_IDENTIFICATION=C

            attached base packages:
            [1] stats4    parallel  stats     graphics  grDevices utils
                datasets
            methods   base

            other attached packages:
               [1] VariantAnnotation_1.16.0   Rsamtools_1.22.0
            Biostrings_2.38.0
                XVector_0.10.0 SummarizedExperiment_1.0.0
               [6] Biobase_2.30.0             GenomicRanges_1.22.0
            GenomeInfoDb_1.6.0
                   IRanges_2.4.0              S4Vectors_0.8.0
            [11] BiocGenerics_0.16.0        vimcom_1.2-3 setwidth_1.0-4
               colorout_1.1-0

            loaded via a namespace (and not attached):
               [1] AnnotationDbi_1.32.0    GenomicAlignments_1.6.0
            zlibbioc_1.16.0
               BiocParallel_1.4.0      BSgenome_1.38.0         tools_3.2.2
               [7] DBI_0.3.1               lambda.r_1.1.7
            futile.logger_1.4.1
               rtracklayer_1.30.0      futile.options_1.0.0 bitops_1.0-6
            [13] RCurl_1.95-4.7          biomaRt_2.26.0
            RSQLite_1.0.0
            GenomicFeatures_1.22.0  XML_3.98-1.3




            This is what happens in current devel:

            library(VariantAnnotation)

            VRanges()
            Error:   The "ifelse" methods for Rle objects are defunct.
            Please use

                    as(ifelse(test, as.vector(yes), as.vector(no)), "Rle")

                instead.
            sessionInfo()
            R Under development (unstable) (2015-10-14 r69514)
            Platform: x86_64-pc-linux-gnu (64-bit)
            Running under: Fedora release 12 (Constantine)

            locale:
               [1] LC_CTYPE=en_US.UTF8       LC_NUMERIC=C LC_TIME=en_US.UTF8
               [4] LC_COLLATE=en_US.UTF8     LC_MONETARY=en_US.UTF8
            LC_MESSAGES=en_US.UTF8
               [7] LC_PAPER=en_US.UTF8       LC_NAME=C
              LC_ADDRESS=C
            [10] LC_TELEPHONE=C            LC_MEASUREMENT=en_US.UTF8
            LC_IDENTIFICATION=C

            attached base packages:
            [1] stats4    parallel  stats     graphics  grDevices utils
                datasets
            methods   base

            other attached packages:
               [1] VariantAnnotation_1.17.0   Rsamtools_1.23.0
            Biostrings_2.39.0
               [4] XVector_0.11.0             SummarizedExperiment_1.1.0
            Biobase_2.31.0
               [7] GenomicRanges_1.21.32      GenomeInfoDb_1.7.0
            IRanges_2.5.1
            [10] S4Vectors_0.9.2            BiocGenerics_0.17.0
            vimcom_1.0-0
            [13] setwidth_1.0-4             colorout_1.0-3

            loaded via a namespace (and not attached):
               [1] AnnotationDbi_1.33.0    GenomicAlignments_1.7.0
            zlibbioc_1.17.0
               BiocParallel_1.5.0
               [5] BSgenome_1.39.0         tools_3.3.0             DBI_0.3.1
               lambda.r_1.1.7
               [9] futile.logger_1.4.1     rtracklayer_1.31.0
            futile.options_1.0.0
            bitops_1.0-6
            [13] RCurl_1.95-4.7          biomaRt_2.27.0
            RSQLite_1.0.0
            GenomicFeatures_1.23.3
            [17] XML_3.98-1.3

            _______________________________________________
            Bioc-devel@r-project.org <mailto:Bioc-devel@r-project.org>
            mailing list
            https://stat.ethz.ch/mailman/listinfo/bioc-devel


                 [[alternative HTML version deleted]]

        _______________________________________________
        Bioc-devel@r-project.org <mailto:Bioc-devel@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: hpa...@fredhutch.org <mailto:hpa...@fredhutch.org>
    Phone: (206) 667-5791 <tel:%28206%29%20667-5791>
    Fax: (206) 667-1319 <tel:%28206%29%20667-1319>



--
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: hpa...@fredhutch.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to