[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