如何随时避免这种情况(<;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>