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.

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.

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!




-- 
Alexandre Sieira
CISA, CISSP, ISO 27001 Lead Auditor

"The truth is rarely pure and never simple."
Oscar Wilde, The Importance of Being Earnest, 1895, Act I
______________________________________________
R-help@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.

Reply via email to