持续时间{lubridate}:持续时间可以为负数吗?

jan*_*ane 4 time datetime r lubridate

我读过的每个文档似乎都表明lubridate 1.7.4 中的持续时间可能为负数,包括 R 文档提供的示例:

> duration(-1, "days")
> duration(day = -1)
Run Code Online (Sandbox Code Playgroud)

2009 年的这个 bug 修复与示例输出内容类似:

> new_duration(secs = -1, mins = -1, hours = -1)
[1] "-1 hours, -1 minutes and -1 seconds"
Run Code Online (Sandbox Code Playgroud)

但是当我运行时duration(-1, "days"),R 返回:

[1] "86400s (~1 days)"
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

Cal*_*You 6

是的,它们可能是负面的。从源代码的阅读来看,这是该类的 print 方法的产物Duration。检查该对象表明,尽管没有这样显示,但它仍保持负数,并且其行为就像应有的负数一样,如下所示。

我认为罪魁祸首是这里源代码的第102行。该format.Duration函数abs在打印Duration. 我想这是有意的行为,尽管您必须与开发人员讨论其推理(可能是因为人们倾向于将持续时间理解为积极的。)

编辑:2019 年 12 月,打印方法已更改为显示带有前导 - 的负持续时间,因此现在这种情况应该只发生在旧版本的 lubridate 上。

library(lubridate)
neg <- duration(-1)
pos <- duration(2)
neg + pos
#> [1] "1s"
unclass(neg)
#> [1] -1
Run Code Online (Sandbox Code Playgroud)