duration {lubridate}: длительности могут быть отрицательными? - PullRequest
0 голосов
/ 02 июня 2018

Кажется, что каждая прочитанная документация указывает на то, что длительности могут быть отрицательными в lubridate 1.7.4, включая примеры, представленные в документации R:

> duration(-1, "days")
> duration(day = -1)

Это одно исправление в 2009 говорит что-то похожее с примером вывода:

> new_duration(secs = -1, mins = -1, hours = -1)
[1] "-1 hours, -1 minutes and -1 seconds"

Но когда я запускаю duration(-1, "days"), R возвращает:

[1] "86400s (~1 days)"

В чем дело?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Да, они могут быть отрицательными.Из чтения исходного кода это артефакт метода print для класса Duration.Проверка объекта показывает, что он остается отрицательным, несмотря на то, что не отображается как таковой, и ведет себя как отрицательное число, как и должно быть, как показано ниже.

Я думаю, что виновником является строка 102 исходного кода здесь .Функция format.Duration вызывает abs при печати Duration.Я предполагаю, что это предполагаемое поведение, хотя вам придется обсудить его с разработчиками по причинам (вероятно, потому что люди склонны понимать длительности как положительные.)

library(lubridate)
neg <- duration(-1)
pos <- duration(2)
neg + pos
#> [1] "1s"
unclass(neg)
#> [1] -1

Создано в 2018-06-01 представьте пакет (v0.2.0).

0 голосов
/ 02 июня 2018

Я полагаю, что при печати все еще существует проблема, но длительность отлично работает при отрицательном значении:

date <- mdy("7/8/17")
date - duration(10, "days")
# [1] "2017-06-28"
date + duration(-10, "days)
# [1] "2017-06-28"

Длительность - это класс с .Data слотом, содержащим длительность в секундах, и выможете проверить, что это действительно отрицательно:

duration(-10, "days")@.Data
# [1] -864000
duration(-10, "days")@.Data / 3600 / 24 # to get the days:
# [1] -10
...