[R] as.vector with mode="list" and POSIXct

William Dunlap wdunlap at tibco.com
Wed May 22 23:19:02 CEST 2013


> You may not have expected it, but that result is what is described: From the help page for `as.vector`:
> 
> "For as.vector, a vector (atomic or of type list). All attributes are removed from the result if it is of an atomic mode, ..."
> 
> And since POSIXct vectors _are_ of atomic mode, all of their attributes are removed.

It is not that simple: as.vector is a generic function and may have methods written for certain classes (just
as with as.list).  It does have a method for factor (which has an atomic mode)
  > methods("as.vector")
  [1] as.vector.factor
so we get some attributes copied
  > f <- factor(c("Anteater","Bear","Cat"))
  > str(f)
   Factor w/ 3 levels "Anteater","Bear",..: 1 2 3
  > str(as.vector(f, mode="list"))
  List of 3
   $ : Factor w/ 3 levels "Anteater","Bear",..: 1
   $ : Factor w/ 3 levels "Anteater","Bear",..: 2
   $ : Factor w/ 3 levels "Anteater","Bear",..: 3
Since there is no POSIXct method we get the default behavior.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of David Winsemius
> Sent: Wednesday, May 22, 2013 1:52 PM
> To: Alexandre Sieira
> Cc: r-help at r-project.org
> Subject: Re: [R] as.vector with mode="list" and POSIXct
> 
> 
> On May 20, 2013, at 2:09 PM, Alexandre Sieira wrote:
> 
> > I was trying to convert a vector of POSIXct into a list of POSIXct, However, I had a
> problem that I wanted to share with you.
> >
> > Works fine with, say, numeric:
> >
> >
> >> v = c(1, 2, 3)
> >> v
> > [1] 1 2 3
> >> str(v)
> >  num [1:3] 1 2 3
> >> l = as.vector(v, mode="list")
> >> l
> > [[1]]
> > [1] 1
> >
> > [[2]]
> > [1] 2
> >
> > [[3]]
> > [1] 3
> >
> >> str(l)
> > List of 3
> >  $ : num 1
> >  $ : num 2
> >  $ : num 3
> >
> > If you try it with POSIXct, on the other hand...
> >
> >
> >> v = c(Sys.time(), Sys.time())
> >> v
> > [1] "2013-05-20 18:02:07 BRT" "2013-05-20 18:02:07 BRT"
> >> str(v)
> >  POSIXct[1:2], format: "2013-05-20 18:02:07" "2013-05-20 18:02:07"
> >> l = as.vector(v, mode="list")
> >> l
> > [[1]]
> > [1] 1369083728
> >
> > [[2]]
> > [1] 1369083728
> >
> >> str(l)
> > List of 2
> >  $ : num 1.37e+09
> >  $ : num 1.37e+09
> >
> > The POSIXct values are coerced to numeric, which is unexpected.
> 
> You may not have expected it, but that result is what is described: From the help page for
> `as.vector`:
> 
> "For as.vector, a vector (atomic or of type list). All attributes are removed from the result
> if it is of an atomic mode, ..."
> 
> And since POSIXct vectors _are_ of atomic mode, all of their attributes are removed.
> 
> > is.atomic(as.POSIXct("2001-01-01") )
> [1] TRUE
> 
> (I realize that this is a belated response, and that you and Jeff Newmiller are continuing a
> correspondence on what I think appears to be a separate concern) , but I needed to go
> back to the first posting to figure out what the questions were.
> 
> >
> > The documentation for as.vector says: "The default method handles 24 input types and
> 12 values of type: the details of most coercions are undocumented and subject to
> change." It would appear that treatment for POSIXct is either missing or needs
> adjustment.
> 
> As in the case of factor-classed vectors, POSIXct-vectors are atomic mode. Yours was a
> selective reading. (And you found a way around this with `as.list`.)
> 
> > is.atomic(factor("2001-01-01") )
> [1] TRUE
> --
> David.
> >
> > Unlist (for the reverse) is documented to converting to base types, so I can't complain.
> Just wanted to share that I ended up giving up on vectorization and writing the two
> following functions:
> >
> >
> > unlistPOSIXct <- function(x) {
> >   retval = rep(Sys.time(), length(x))
> >   for (i in 1:length(x)) retval[i] = x[[i]]
> >   return(retval)
> > }
> >
> > listPOSIXct <- function(x) {
> >   retval = list()
> >   for (i in 1:length(x)) retval[[i]] = x[i]
> >   return(retval)
> > }
> >
> > Is there a better way to do this (other than using *apply instead of for above) that
> better leverages vectorization? Am I missing something here?
> >
> > Thanks!
> >
> >
> --
> 
> David Winsemius
> Alameda, CA, USA
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list