如何避免anytime(<numeric>)“通过引用更新”?

时间:2018-06-24 13:49:23

标签: r date datetime 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"

这不同于as.POSIXct R中base的“不按引用更新”行为:

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中处理吗?

5 个答案:

答案 0 :(得分:10)

anytime的作者:这是标准的R和Rcpp以及传递SEXP的行为:您无法保护SEXP的传递不被更改。

anytime的观点是您正在要求将输入转换为POSIXct ,因为anytime所做的就是:从char ,从整数,从因数,从任何事物。由于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> 

由于字符串表示形式是类型更改,因此在data.table中的工作方式相同。 IDate / ITime的同上。

编辑:自2017年6月以来,Github存储库中的开发版本具有保留传入参数的功能。因此,无论何时我推它,下一个CRAN版本也将具有它。 / p>

答案 1 :(得分:2)

您可以这样修改它:

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

答案 2 :(得分:2)

如果您这样做,它将起作用:

t_num <- 1529734500
anytime(t_num*1)

#> anytime(t_num*1)
#[1] "2018-06-23 06:15:00 UTC"
#> t_num
#[1] 1529734500

答案 3 :(得分:2)

是否有理由与anytime结婚?

.POSIXct(t_num, tz = 'Europe/Berlin')
# [1] "2018-06-23 08:15:00 CEST"

.POSIXct(x, tz)structure(x, class = c('POSIXct', 'POSIXt'), tzone = tz)的包装(即您可以忽略声明原点),并且本质上是as.POSIXct.numeric(除了后者在允许使用非UTC原始日期方面非常灵活),看print(as.POSIXct.numeric)

答案 4 :(得分:2)

在发布问题之前完成作业时,我检查了open anytime issues。现在,我还浏览了 closed ,发现与我的问题完全相同:

anytime is overwriting inputs

软件包作者在其中写道:

  

我想是因为as.POSIXct()不理会输入内容,我们也应该这样做吗?

因此来自anytime version 0.3.1 (unreleased)

  

现在将保留数字输入,而不是将其静默转换为返回对象类型


因此,我的问题的一个答案是:“等待0.3.1” *。

发布0.3.1时,anytime(<numeric>)的行为将与anytime(<non-numeric>)as.POSIXct(<numeric>)一致,并且不需要解决方法。


*不必等待太久:0.3.1 is now released:“ 现在保留了数字输入,而不是无声地强制转换为返回对象类型