如何随时避免这种情况(<;numeric>;)";通过引用进行更新;?

如何随时避免这种情况(<;numeric>;)";通过引用进行更新;?,r,date,datetime,posixct,R,Date,Datetime,Posixct,我想使用anytime将数值变量转换为POSIXct。我的问题是anytime()也会转换输入变量-我想保留它 简单的例子: 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" 类似地,anydate()也通过引用进行更新: d_num <- 17707 anydate(d_num) #

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

简单的例子:

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"

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

d_num <- 17707
anydate(d_num)
# [1] "2018-06-25"
d_num
# [1] "2018-06-25"

d_num你可以这样破解它:

library(anytime)
t_num <- 1529734500
anytime(t_num+0)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_num
# [1] 1529734500
库(任何时候)

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

t_num <- 1529734500
anytime(t_num*1)

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

任何时候都有结婚的理由吗

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

.POSIXct(x,tz)
结构(x,class=c('POSIXct','POSIXt'),tzone=tz)
的包装器(即,您可以忽略声明原点),本质上是
as.POSIXct.numeric
(后者在允许非UTC原点日期方面非常灵活),请查看
打印(as.POSIXct.numeric)

任何时候
作者:这是标准的R和Rcpp和路过-
SEXP
行为:您无法保护路过的
SEXP
不被更改

anytime
的观点是,您要求将输入转换为
POSIXct
,因为
anytime
就是这样做的:从char、从int、从factor、从anything。作为一个
POSIXct
实际上是一个数值(加上一个S3类属性),这就是您得到的

如果您不想这样做(与
anytime
的设计相反),您可以按照@Moody_mudscapper和@PKumar所显示的那样:使用临时表达式(或变量)

(我还认为
data.table
示例有点不公平,因为
data.table
——就像
Rcpp
——非常明确地表示尽可能地引用引用。因此,它当然会引用原始变量。如果需要,可以使用深度复制的习惯用法。)

最后,一个明显的技巧是,如果您只想显示不同的内容,请使用
格式

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> 
R>dd[1,“posixct”]d
t_num posixct
1 1529734500 2018-06-23 01:15:00
R>
当然,这与
data.table
中的工作方式相同,因为字符串表示形式是一种类型更改。同上,
IDate
/
ITime


编辑:自2017年6月以来,Github repo中的开发版本具有保留传入参数的功能。所以下一个CRAN版本,每当我推它的时候,也会有它。

当我在发布问题之前做作业时,我检查了答案。我现在也浏览了关闭的问题,在那里我发现了与我完全相同的问题:

在那里,软件包作者写道:

我想是因为
as.POSIXct()
不处理它的输入,我们也应该这样做吗

因此,来自:

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


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

当发布
0.3.1
时,
anytime()
的行为将与
anytime()
as.POSIXct()
一致,并且无需采取变通措施



*无需等待太长时间::“数字输入现在被保留,而不是以静默方式强制转换为返回对象类型”

查看我的更新答案,显示它与integer的工作方式不同inputs@Moody_Mudskipper:这正是我们在
Rcpp
中多次展示的gotcha示例:
int
numeric
函数的输入执行强制转换,因此是复制,因此(现在复制)输入没有更改!鉴于这种不一致性,任何不将
案例放入
.POSIXct
的理由都是.numeric
案例?据我所知,速度是一样的。
POSIXct
不是原生的
SEXP
类型;它是一个带有S3类属性的
数值
。因此,在C++级别上,“基本上是相同的”,对于非<代码>数字< <代码> v>代码>数字< /代码>的输入行为是不同的。这正是不一致性的定义(不管它是不是设计的,都是正交的)。不管怎样,只要在文档中明确说明,设计就由你决定。是的,回答也不错。请参阅我(稍后)的回答和评论,了解原因。只要注意到您的
tunum
不是真实的(例如
data.table:::isReallyReal(tunum)
),也就是说,您可以用
1529734500L
:)替换它,只是
class(1529734500)
numeric
,而
class(1529734500L)
不是,因此,您可以通过从整数开始强制执行“it is a cast so you get a copy”来避免
1*
/
0+
kludges。当然,1529734500是
数字
,但正如您所指出的,
数据。表
提醒我们可以使用
整数
表示相同的值。
.POSIXct(t_num, tz = 'Europe/Berlin')
# [1] "2018-06-23 08:15:00 CEST"
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>