如何随时避免这种情况(<numeric>) "updates by reference"?
How to avoid that anytime(<numeric>) "updates by reference"?
我想使用 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"
这与 as.POSIXct
在 base
中的 'non-update by reference' 行为不同 R:
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
内处理这个问题吗?
你可以这样破解:
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
如果你这样做,它就会起作用:
t_num <- 1529734500
anytime(t_num*1)
#> anytime(t_num*1)
#[1] "2018-06-23 06:15:00 UTC"
#> t_num
#[1] 1529734500
有什么理由要嫁给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)
.
anytime
作者在这里:这是标准的 R 和 Rcpp 以及传递 SEXP
行为:你无法保护传递的 SEXP
不被更改。
anytime
的观点是 您要求将输入转换为 POSIXct
,因为这就是 anytime
做:来自 char,来自 int,来自 factor,来自任何东西。作为一个 POSIXct
实际上 是 一个数值(加上一个 S3 class 属性)这就是你得到的。
如果你不想要这个(与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 回购中的开发版本自 2017 年 6 月以来就具有保留传入参数的功能。所以下一个 CRAN 版本,无论何时我都会推一下,也会有的
发题前做作业时,我检查了open anytime
issues。我现在也浏览了 closed 的,在那里我发现了与我完全相同的问题:
包作者写道:
I presume because as.POSIXct()
leaves its input alone, we should too?
所以来自 anytime version 0.3.1 (unreleased)
:
Numeric input is now preserved rather than silently cast to the return object type
因此,我的问题的一个答案是:"wait for 0.3.1
"*.
当 0.3.1
发布时,anytime(<numeric>)
的行为将与 anytime(<non-numeric>)
和 as.POSIXct(<numeric>)
一致,并且不需要解决方法。
*不必等待太久:0.3.1 is now released:“现在保留数字输入,而不是默默地转换为 return 对象类型 “
我想使用 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"
这与 as.POSIXct
在 base
中的 'non-update by reference' 行为不同 R:
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
内处理这个问题吗?
你可以这样破解:
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
如果你这样做,它就会起作用:
t_num <- 1529734500
anytime(t_num*1)
#> anytime(t_num*1)
#[1] "2018-06-23 06:15:00 UTC"
#> t_num
#[1] 1529734500
有什么理由要嫁给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)
.
anytime
作者在这里:这是标准的 R 和 Rcpp 以及传递 SEXP
行为:你无法保护传递的 SEXP
不被更改。
anytime
的观点是 您要求将输入转换为 POSIXct
,因为这就是 anytime
做:来自 char,来自 int,来自 factor,来自任何东西。作为一个 POSIXct
实际上 是 一个数值(加上一个 S3 class 属性)这就是你得到的。
如果你不想要这个(与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 回购中的开发版本自 2017 年 6 月以来就具有保留传入参数的功能。所以下一个 CRAN 版本,无论何时我都会推一下,也会有的
发题前做作业时,我检查了open anytime
issues。我现在也浏览了 closed 的,在那里我发现了与我完全相同的问题:
包作者写道:
I presume because
as.POSIXct()
leaves its input alone, we should too?
所以来自 anytime version 0.3.1 (unreleased)
:
Numeric input is now preserved rather than silently cast to the return object type
因此,我的问题的一个答案是:"wait for 0.3.1
"*.
当 0.3.1
发布时,anytime(<numeric>)
的行为将与 anytime(<non-numeric>)
和 as.POSIXct(<numeric>)
一致,并且不需要解决方法。
*不必等待太久:0.3.1 is now released:“现在保留数字输入,而不是默默地转换为 return 对象类型 “