From ripley at stats.ox.ac.uk  Wed Jul 30 14:29:38 2008
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Wed, 30 Jul 2008 13:29:38 +0100 (BST)
Subject: [Rd] sapply(Date, is.numeric)
In-Reply-To: <18576.11368.858281.462289@stat.math.ethz.ch>
References: <EEBC169715EB8C438D3C9283AF0F201C023E47B4@MSGBOSCLM2WIN.DMN1.FMR.COM>
	<18576.11368.858281.462289@stat.math.ethz.ch>
Message-ID: <alpine.LFD.1.10.0807301248250.24325@auk.stats.ox.ac.uk>

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.

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

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

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

> 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

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

I'm testing fixes for both.

> ## 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
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] sapply(Date, is.numeric)
Prof Brian Ripley