我想使用anytime将一个数值变量转换为POSIXct。我的问题是anytime(<numeric>)也会转换输入变量--我想保留它。
简单的例子:
library(anytime)
t_num <- 1529734500
anytime(t_num)
# [1] "2018-06-23 08:15:00 CEST"
t_num
# [1] "2018-06-23 08:15:00 CEST"这与base R中as.POSIXct的“非引用更新”行为不同:
t_num <- 1529734500
as.POSIXct(t_num, origin = "1970-01-01")
# [1] "2018-06-23 08:15:00 CEST"
t_num
# 1529734500类似地,anydate(<numeric>)也通过引用进行更新:
d_num <- 17707
anydate(d_num)
# [1] "2018-06-25"
d_num
# [1] "2018-06-25"我在?anytime中找不到对此行为的明确描述。我可以像上面那样使用as.POSIXct,但是有人知道如何在anytime中处理这个问题吗
发布于 2018-06-24 22:05:03
你可以这样破解它:
library(anytime)
t_num <- 1529734500
anytime(t_num+0)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_num
# [1] 1529734500请注意,整数输入的处理方式将有所不同:
t_int <- 1529734500L
anytime(t_int)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_int
# [1] 1529734500发布于 2018-06-24 22:21:16
anytime作者:这是标准的R和Rcpp以及按SEXP传递的行为:您不能保护传递的SEXP不被更改。
anytime所采用的观点是,您请求将输入转换为POSIXct,因为这就是anytime所做的:从字符、从整数、从因子、从任何东西。因为类实际上是一个数值(加上一个S3 POSIXct属性),所以这就是您要得到的结果。
如果你不想这样(与anytime的设计相反),你可以像@Moody_Mudskipper和@PKumar那样做:使用一个临时表达式(或变量)。
(我还认为data.table示例有点不公平,因为data.table --就像Rcpp一样--非常明确地表示要在可以引用的地方引用。当然,它引用的是原始变量。如果您需要的话,有一些用于深度复制的习惯用法。)
最后,如果你只是想要不同的显示,一个明显的诀窍是使用format:
R> d <- data.frame(t_num=1529734500)
R> d[1, "posixct"] <- format(anytime::anytime(d[1, "t_num"]))
R> d
t_num posixct
1 1529734500 2018-06-23 01:15:00
R> 当然,这在data.table中也是一样的,因为字符串表示是一种类型更改。IDate / ITime也是如此。
编辑: Github repo中的开发版本自2017年6月以来一直具有保留传入参数的功能。因此,下一个CRAN版本,无论何时我推送它,都会有它。
发布于 2018-06-24 22:05:44
如果你这样做,它将会起作用:
t_num <- 1529734500
anytime(t_num*1)
#> anytime(t_num*1)
#[1] "2018-06-23 06:15:00 UTC"
#> t_num
#[1] 1529734500https://stackoverflow.com/questions/51010539
复制相似问题