Re: [Rd] [R] Date Format

From: Prof Brian Ripley <ripley_at_stats.ox.ac.uk>
Date: Wed 12 Jul 2006 - 09:50:54 GMT

On Wed, 12 Jul 2006, Martyn Plummer wrote:

> On Tue, 2006-07-11 at 20:05 +0200, Peter Dalgaard wrote:
> > Martyn Plummer <plummer@iarc.fr> writes:
> >
> > > I moved this to R-devel because I am wondering why the base package does
> > > not allow you to convert from numeric to Date. Could we not have
> > > something like this?
> > >
> > > as.Date.numeric <- function(x, epoch="1970-01-01", ...) {
> > > if (!is.character(epoch) || length(epoch) != 1)
> > > stop("invalid epoch")
> > > as.Date(epoch, ...) + x
> > > }
> >
> > We could, but you might as well do it explicitly. There's something to
> > be said for not confusing the concept of dates with a particular
> > implementation, which is effectively what happens if you can convert
> > them to and from numeric too seamlessly.
>
> Currently you can easily convert one way, but not the other. I just find
> that a bit odd.
>
> Pierre's problem was that his Date objects were converted internally by
> some function. His first instinct, to use as.Date to convert them back,
> was, I think, correct. But that doesn't work. So now we say "You have to
> understand how Date objects are implemented to get your dates back"? I
> don't know about that.

I agree with what we say: it was deliberate not to interpret plain numbers.

> > I'm more perplexed by the failure of adding difftimes to dates:
> >
> > > as.Date("2006-1-1") + (as.Date("2006-1-1") - as.Date("2006-1-2"))
> > [1] "2005-12-31"
> > Warning message:
> > Incompatible methods ("+.Date", "Ops.difftime") for "+"
> >
> > and if you have a difftime in non-days units, you'll actually get a
> > wrong result:
> >
> > > D1 <- as.Date("2006-1-1")
> > > D2 <- as.Date("2006-1-2")
> > > difftime(D2,D1,units="hours")
> > Time difference of 24 hours
> > > dd <- difftime(D2,D1,units="hours")
> > > D1+dd
> > [1] "2006-01-25"
> > Warning message:
> > Incompatible methods ("+.Date", "Ops.difftime") for "+"
>
> [I raised this problem earlier in private discussions with Peter]
>
> It certainly is perplexing. There is code in "+.Date" that correctly
> handles the case where the second argument is a difftime. But it will
> never get called! I wonder if it ever worked.

Yes, it worked before Ops.difftime was added.

> The warning is coming from DispatchGroup (in eval.c). When it finds
> different methods for two arguments of a binary group generic, it gives
> up and the default method is called - in this case R_binary in
> arithmetic.c - which is why the results depends on the implementation of
> the difftime object.
>
> I guessed that this was a limitation of S3 generics, and I suppose I was
> right. To allow mixing arguments of two classes, you would need code in
> Ops.foo to handle objects of class bar *and* vice versa. It's a bad
> idea to have two separate bits of code to do the same job, so I can't
> fault the logic of forbidding this, but it does leave us with some
> usability problems.
>
> While we are on the topic, is there no function to convert a difftime
> object from one time scale to another? I found a couple of private
> functions, but nothing public.

There is none: the intention is that the user should leave this to the functions he uses.

-- 
Brian D. Ripley,                  ripley@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

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Wed Jul 12 19:54:23 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Wed 12 Jul 2006 - 12:28:11 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.