>From the Bioconductor side of things, the general feeling is that this is a 
>step in the right direction and worth the broken packages. Martin Morgan
________________________________________
From: R-devel [r-devel-boun...@r-project.org] on behalf of Martin Maechler 
[maech...@stat.math.ethz.ch]
Sent: Friday, December 11, 2015 4:25 AM
To: John Chambers; r-de...@r-project.org; bioc-devel list; Benjamin Tyner
Cc: Martin Maechler
Subject: Re: [Rd] For integer vectors, `as(x, "numeric")` has no effect.

>>>>> Martin Maechler <maech...@stat.math.ethz.ch>
>>>>>     on Tue, 8 Dec 2015 15:25:21 +0100 writes:

>>>>> John Chambers <j...@r-project.org>
>>>>>     on Mon, 7 Dec 2015 16:05:59 -0800 writes:

    >> We do need an explicit method here, I think.
    >> The issue is that as() uses methods for the generic function coerce() 
but cannot use inheritance in the usual way (if it did, you would be 
immediately back with no change, since "integer" inherits from "numeric").

    >> Copying in the general method for coercing to "numeric" as an explicit 
method for "integer" gives the expected result:

    >>> setMethod("coerce", c("integer", "numeric"), getMethod("coerce", 
c("ANY", "numeric")))
    >> [1] "coerce"
    >>> typeof(as(1L, "numeric"))
    >> [1] "double"

    >> Seems like a reasonable addition to the code, unless someone sees a 
problem.
    >> John

    > I guess that that some package checks (in CRAN + Bioc + ... -
    > land) will break,
    > but I still think we should add such a coercion to R.

    > Martin

Hmm...  I've tried to add the above to R
and do notice that there are consequences that may be larger than
anticipated:

Here is example code:

   myN   <- setClass("myN",   contains="numeric")
   myNid <- setClass("myNid", contains="numeric", 
representation(id="character"))
   NN <-    setClass("NN", representation(x="numeric"))

   (m1 <- myN  (1:3))
   (m2 <- myNid(1:3, id = "i3"))
   tools::assertError(NN (1:3))# in all R versions

   ##                     # current R  |  new R
   ##                     # -----------|----------
   class(getDataPart(m1)) # integer    |  numeric
   class(getDataPart(m2)) # integer    |  numeric


In other words, with the above setting, the traditional
gentleperson's agreement in S and R,

  __ "numeric" sometimes conveniently means "integer" or "double"  __

will be slightly less often used ... which of course may be a
very good thing.

However, it breaks strict back compatibility also in cases where
the previous behavior may have been preferable:
After all integer vectors need only have the space of doubles.

Shall we still go ahead and do apply this change to R-devel
and then all package others will be willing to update where necessary?

As this may affect the many hundreds of bioconductor packages
using S4 classes, I am -- exceptionally -- cross posting to the
bioc-devel list.

Martin Maechler


    >> On Dec 7, 2015, at 3:37 PM, Benjamin Tyner <bty...@gmail.com> wrote:

    >>> Perhaps it is not that surprising, given that
    >>>
    >>> > mode(1L)
    >>> [1] "numeric"
    >>>
    >>> and
    >>>
    >>> > is.numeric(1L)
    >>> [1] TRUE
    >>>
    >>> On the other hand, this is curious, to say the least:
    >>>
    >>> > is.double(as(1L, "double"))
    >>> [1] FALSE
    >>>
    >>>> Here's the surprising behavior:
    >>>>
    >>>> x <- 1L
    >>>> xx <- as(x, "numeric")
    >>>> class(xx)
    >>>> ## [1] "integer"
    >>>>
    >>>> It occurs because the call to `as(x, "numeric")` dispatches the coerce
    >>>> S4 method for the signature `c("integer", "numeric")`, whose body is
    >>>> copied in below.
    >>>>
    >>>> function (from, to = "numeric", strict = TRUE)
    >>>> if (strict) {
    >>>> class(from) <- "numeric"
    >>>> from
    >>>> } else from
    >>>>
    >>>> This in turn does nothing, even when strict=TRUE, because that
    >>>> assignment to class "numeric" has no effect:
    >>>>
    >>>> x <- 10L
    >>>> class(x) <- "numeric"
    >>>> class(x)
    >>>> [1] "integer"
    >>>>
    >>>> Is this the desired behavior for `as(x, "numeric")`?
    >>>
    >>> ______________________________________________
    >>> r-de...@r-project.org mailing list
    >>> https://stat.ethz.ch/mailman/listinfo/r-devel

    >> ______________________________________________
    >> r-de...@r-project.org mailing list
    >> https://stat.ethz.ch/mailman/listinfo/r-devel

    > ______________________________________________
    > r-de...@r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
r-de...@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


This email message may contain legally privileged and/or confidential 
information.  If you are not the intended recipient(s), or the employee or 
agent responsible for the delivery of this message to the intended 
recipient(s), you are hereby notified that any disclosure, copying, 
distribution, or use of this email message is prohibited.  If you have received 
this message in error, please notify the sender immediately by e-mail and 
delete this email message from your computer. Thank you.
_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to