如何随时避免(<numeric>)"通过引用更新"?

Hen*_*rik 10 datetime r date posixct

我想将数字变量转换为POSIXct使用anytime.我的问题是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"
Run Code Online (Sandbox Code Playgroud)

这不同于的行为"通过引用非更新" as.POSIXctbaseR:

t_num <- 1529734500
as.POSIXct(t_num, origin = "1970-01-01")
# [1] "2018-06-23 08:15:00 CEST"
t_num
# 1529734500
Run Code Online (Sandbox Code Playgroud)

同样,anydate(<numeric>)也通过引用更新:

d_num <- 17707
anydate(d_num)
# [1] "2018-06-25"
d_num
# [1] "2018-06-25"
Run Code Online (Sandbox Code Playgroud)

我找不到这种行为的明确描述?anytime.我可以as.POSIXct像上面一样使用,但有人知道如何处理这个anytime吗?

Dir*_*tel 10

anytime作者:这是标准的R和Rcpp以及传递SEXP行为:你不能保护SEXP传递不被改变.

需要的视图anytime是,您要求将输入转换为aPOSIXct,即anytime:来自char,from int,from factor,from any.作为一个POSIXct真正数值(加上S3类属性),这是你做了什么.

如果您不想这样(与设计相反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> 
Run Code Online (Sandbox Code Playgroud)

data.table当然,这将以相同的方式工作,因为字符串表示是类型更改.同上IDate/ ITime.

编辑:自2017年6月以来,Github repo中的开发版本具有保留传入参数的功能.因此,下一个CRAN版本,无论何时推送它,都会有它.


Moo*_*per 2

你可以像这样破解它:

library(anytime)
t_num <- 1529734500
anytime(t_num+0)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_num
# [1] 1529734500
Run Code Online (Sandbox Code Playgroud)

请注意,整数输入将被区别对待:

t_int <- 1529734500L
anytime(t_int)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_int
# [1] 1529734500
Run Code Online (Sandbox Code Playgroud)