首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免anytime(<numeric>)“按引用更新”?

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

Stack Overflow用户
提问于 2018-06-24 21:49:23
回答 4查看 434关注 0票数 10

我想使用anytime将一个数值变量转换为POSIXct。我的问题是anytime(<numeric>)也会转换输入变量--我想保留它。

简单的例子:

代码语言:javascript
复制
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的“非引用更新”行为不同:

代码语言:javascript
复制
t_num <- 1529734500
as.POSIXct(t_num, origin = "1970-01-01")
# [1] "2018-06-23 08:15:00 CEST"
t_num
# 1529734500

类似地,anydate(<numeric>)也通过引用进行更新:

代码语言:javascript
复制
d_num <- 17707
anydate(d_num)
# [1] "2018-06-25"
d_num
# [1] "2018-06-25"

我在?anytime中找不到对此行为的明确描述。我可以像上面那样使用as.POSIXct,但是有人知道如何在anytime中处理这个问题吗

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-24 22:05:03

你可以这样破解它:

代码语言:javascript
复制
library(anytime)
t_num <- 1529734500
anytime(t_num+0)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_num
# [1] 1529734500

请注意,整数输入的处理方式将有所不同:

代码语言:javascript
复制
t_int <- 1529734500L
anytime(t_int)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_int
# [1] 1529734500
票数 2
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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版本,无论何时我推送它,都会有它。

票数 10
EN

Stack Overflow用户

发布于 2018-06-24 22:05:44

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

代码语言:javascript
复制
t_num <- 1529734500
anytime(t_num*1)

#> anytime(t_num*1)
#[1] "2018-06-23 06:15:00 UTC"
#> t_num
#[1] 1529734500
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51010539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档