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@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