Try using as.list(x) instead of as.vector(x, mode="list"). The former has a method for POSIXct; the latter does not.
> x <- as.POSIXct(c("2013-05-20 14:28", "2013-11-30 22:10"), tz="US/Pacific") > x [1] "2013-05-20 14:28:00 PDT" "2013-11-30 22:10:00 PST" > as.list(x) [[1]] [1] "2013-05-20 14:28:00 PDT" [[2]] [1] "2013-11-30 22:10:00 PST" Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -----Original Message----- > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > Behalf > Of Alexandre Sieira > Sent: Monday, May 20, 2013 2:10 PM > To: r-help@r-project.org > Subject: [R] as.vector with mode="list" and POSIXct > > 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.