[Rd] sapply(Date, is.numeric)

Martin Maechler maechler at stat.math.ethz.ch
Wed Jul 30 15:11:12 CEST 2008


>>>>> "BDR" == Prof Brian Ripley <ripley at stats.ox.ac.uk>
>>>>>     on Wed, 30 Jul 2008 13:29:38 +0100 (BST) writes:

    BDR> On Wed, 30 Jul 2008, Martin Maechler wrote:
    >>>>>>> "RobMcG" == McGehee, Robert <Robert.McGehee at geodecapital.com>
    >>>>>>> on Tue, 29 Jul 2008 15:40:37 -0400 writes:
    >> 
    RobMcG> FYI,
    RobMcG> I've tried posting the below message twice to the bug tracking system,
    >> 
    >> [....... r-bugs problems discussed in a separate thread ....]
    >> 
    >> 
    >> 
    RobMcG> R-developers,
    RobMcG> The results below are inconsistent. From the documentation for
    RobMcG> is.numeric, I expect FALSE in both cases.
    >> 
    >> >> x <- data.frame(dt=Sys.Date())
    >> >> is.numeric(x$dt)
    RobMcG> [1] FALSE
    >> >> sapply(x, is.numeric)
    RobMcG> dt
    RobMcG> TRUE
    >> 
    RobMcG> ## Yet, sapply seems aware of the Date class
    >> >> sapply(x, class)
    RobMcG> dt
    RobMcG> "Date"
    >> 
    >> Yes, thanks a lot, Robert, for the report.
    >> 
    >> That *is* a bug somewhere in the .Internal(lapply(...)) C code,
    >> when S3 dispatch of primitive functions should happen.

    BDR> The bug is in do_is, which uses CHAR(PRINTNAME(CAR(call))), and when 
    BDR> called from lapply that gives "FUN" not "is.numeric".  The root cause is 
    BDR> the following comment

    BDR> FUN = CADR(args);  /* must be unevaluated for use in e.g. bquote */

    BDR> and hence that the function in the *call* passed to do_is can be 
    BDR> unevaluated.

aah!  I see.

    >> Here's an R scriptlet exposing a 2nd example
    >> 
    >> ### lapply(list, FUN)
    >> ### ------------------ seems to sometimes fail for
    >> ### .Primitive S3-generic functions
    >> 
    >> (ds <- seq(from=Sys.Date(), by=1, length=4))
    >> ##[1] "2008-07-30" "2008-07-31" "2008-08-01" "2008-08-02"
    >> ll <- list(d=ds)
    >> lapply(list(d=ds), round)
    >> ## -> Error in lapply(list(d = ds), round) : dispatch error


    BDR> And that's a separate issue, in DispatchGroup which states that arguments 
    BDR> have been evaluated (true) but the 'call' from lapply gives the 
    BDR> unevaluated arguments and so there is a mismatch.

yes, I too found that this was a separate issue, the latter
one being new since version 2.7.0

    BDR> I'm testing fixes for both.

Excellent!
Martin


    >> ## or -- related to bug report by Robert McGehee on R-devel, on 2008-07-29:
    >> sapply(list(d=ds), is.numeric)
    >> ## TRUE
    >> 
    >> ## in spite of
    >> is.numeric(`[[`(ll,1)) ## FALSE , because of
    >> is.numeric.date
    >> 
    >> ## or
    >> round(`[[`(ll,1))
    >> ## [1] "2008-07-30" "2008-07-31" "2008-08-01" "2008-08-02"
    >> 
    >> ##-----------------------------
    >> 
    >> But I'm currently too much tied up with other duties,
    >> to find and test bug-fix.
    >> 
    >> Martin Maechler, ETH Zurich and R-Core Team



More information about the R-devel mailing list