代码之家  ›  专栏  ›  技术社区  ›  Henrik plannapus

如何避免任何时间(<数字>)按引用更新?

  •  10
  • Henrik plannapus  · 技术社区  · 6 年前

    我要将数值变量转换为 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 在里面 base 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公司 如上所述,但有人知道如何处理 任何时候 是吗?

    5 回复  |  直到 6 年前
        1
  •  2
  •   moodymudskipper    6 年前

    你可以这样破解:

    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
  •  10
  •   Dirk is no longer here    6 年前

    anytime 作者:这是R和RCPP标准- SEXP 行为:你不能保护 性别歧视 从改变中被传递。

    认为 任何时候 拿的是那个 您要求将输入转换为 POSIXct 因为那是什么 随时 does:从char,从int,从factor,从任何东西。作为一个 posixct公司 真的? 一个数值(加上一个s3类属性)这就是你得到的。

    如果你不想要这个(与 任何时候 )你可以做@moody_mudskipper和@pkumar显示的事情:使用临时表达式(或变量)。

    (我也认为 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> 
    

    在这里也一样 数据表 当然,字符串表示是一种类型更改。同上 IDate / ITime .

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

        3
  •  2
  •   PKumar    6 年前

    如果你这样做,它将工作:

    t_num <- 1529734500
    anytime(t_num*1)
    
    #> anytime(t_num*1)
    #[1] "2018-06-23 06:15:00 UTC"
    #> t_num
    #[1] 1529734500
    
        4
  •  2
  •   MichaelChirico    6 年前

    结婚的理由 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) 是的。

        5
  •  2
  •   Henrik plannapus    6 年前

    当我在发帖前做作业时,我检查了 open anytime issues 是的。我现在浏览了 关闭 还有,我发现了和我完全一样的问题:

    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 :“ 数值输入现在被保留,而不是自动转换为返回对象类型 “。”