Вы можете написать собственную короткую функцию с желаемыми выходами.
Во-первых, получите функцию для проверки наложения с использованием int_overlaps
, а если TRUE
, верните 0 секунд с помощью make_difftime(0)
.
Если наложения нет, вы можете сделать используйте int_start
и int_end
из пакета lubridate
, чтобы получить начало и конец двух ваших интервалов, которые вы затем сравниваете с difftime
.
Для полноты целесообразно добавить несколько проверка ошибок, чтобы убедиться, что оба входа являются объектами с одним интервалом:
library(lubridate)
interval_difftime <- function(a, b)
{
stopifnot(is.interval(a) & is.interval(b) & length(a) == 1 & length(b) == 1)
if (int_overlaps(a, b)) return(make_difftime(0))
if (int_end(a) < int_start(b)) return(-difftime(int_start(b), int_end(a)))
else return(difftime(int_start(a), int_end(b)))
}
Порядок будет работать так же, как и difftime
, в том случае, если вы сначала установите более поздний интервал, вы получите положительную разницу , но если вы поставите предыдущее первым, это даст отрицательную разницу.
Предположим, у меня есть следующие интервалы x
, y
и z
:
n <- now()
x <- interval(n, n + 5)
y <- interval(n + 3, n + 8)
z <- interval(n + 6, n + 10)
Затем следующие тесты дают желаемые результаты: разница во времени равна нулю, если интервалы перекрываются; в противном случае разница между проксимальными концами интервалов в соответствии с порядком:
interval_difftime(x, y)
#> Time difference of 0 secs
interval_difftime(x, z)
#> Time difference of -1 secs
interval_difftime(z, x)
#> Time difference of 1 secs
Создано в 2020-03-16 пакетом Представить (v0.3.0)