From bc0852144f8a8b8b2cefbe56249e82400134ad60 Mon Sep 17 00:00:00 2001 From: Jake Manger <52495554+jakemanger@users.noreply.github.com> Date: Thu, 28 Sep 2023 10:41:04 +0800 Subject: [PATCH 1/6] Make equality operator compare start and end of interval --- R/intervals.r | 19 +++++++++++++++++++ tests/testthat/test-intervals.R | 9 +++++++++ 2 files changed, 28 insertions(+) diff --git a/R/intervals.r b/R/intervals.r index 26ad2151..1c127832 100644 --- a/R/intervals.r +++ b/R/intervals.r @@ -656,6 +656,25 @@ setMethod("%within%", signature(a = "Interval", b = "list"), function(a, b) { out }) +#' Equality check for Interval objects +#' +#' Check whether `e1` and `e2` have the same start and end date-time objects. +#' +#' @param e1 An Interval object +#' @param e2 Another Interval object +#' @return TRUE if the start and end of `e1` match the start and end of `e1`, otherwise FALSE +#' @method == Interval +#' @export +#' @examples +#' int1 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) +#' int2 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) +#' int3 <- interval(as.Date("2021-01-02"), as.Date("2021-12-31")) +#' +#' int1 == int2 # TRUE +#' int1 == int3 # FALSE +setMethod("==", signature(e1 = "Interval", e2 = "Interval"), function(e1, e2) { + int_start(e1) == int_start(e2) && int_end(e1) == int_end(e2) +}) #' @export as.list.Interval <- function(x, ...) { diff --git a/tests/testthat/test-intervals.R b/tests/testthat/test-intervals.R index e348a52a..0517fa55 100644 --- a/tests/testthat/test-intervals.R +++ b/tests/testthat/test-intervals.R @@ -883,3 +883,12 @@ test_that("Intervals handles missing numbers", { expect_equal(intersect(int, int), int) }) + +test_that("Equality operator checks for matching start and end", { + int1 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) + int2 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) + int3 <- interval(as.Date("2021-01-02"), as.Date("2021-12-31")) + + expect_true(int1 == int2) + expect_false(int1 == int3) +}) From b7fb3f4849402e4366b90c525857d7e41fa1ab0f Mon Sep 17 00:00:00 2001 From: Jake Manger <52495554+jakemanger@users.noreply.github.com> Date: Thu, 28 Sep 2023 10:44:46 +0800 Subject: [PATCH 2/6] update documentation and NAMESPACE --- NAMESPACE | 1 + man/equals-Interval-Interval-method.Rd | 27 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 man/equals-Interval-Interval-method.Rd diff --git a/NAMESPACE b/NAMESPACE index 0eb16cc7..8bb9660a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -244,6 +244,7 @@ exportMethods("*") exportMethods("+") exportMethods("-") exportMethods("/") +exportMethods("==") exportMethods("[") exportMethods("[<-") exportMethods("[[") diff --git a/man/equals-Interval-Interval-method.Rd b/man/equals-Interval-Interval-method.Rd new file mode 100644 index 00000000..2abb90b7 --- /dev/null +++ b/man/equals-Interval-Interval-method.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/intervals.r +\name{==,Interval,Interval-method} +\alias{==,Interval,Interval-method} +\title{Equality check for Interval objects} +\usage{ +\S4method{==}{Interval,Interval}(e1, e2) +} +\arguments{ +\item{e1}{An Interval object} + +\item{e2}{Another Interval object} +} +\value{ +TRUE if the start and end of \code{e1} match the start and end of \code{e1}, otherwise FALSE +} +\description{ +Check whether \code{e1} and \code{e2} have the same start and end date-time objects. +} +\examples{ +int1 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) +int2 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) +int3 <- interval(as.Date("2021-01-02"), as.Date("2021-12-31")) + +int1 == int2 # TRUE +int1 == int3 # FALSE +} From 903a4f206ea14cd51a9d017439b74cae23f6b21d Mon Sep 17 00:00:00 2001 From: jakemanger Date: Fri, 1 Dec 2023 15:46:59 +0800 Subject: [PATCH 3/6] add inequality operator --- NAMESPACE | 1 + R/intervals.r | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/NAMESPACE b/NAMESPACE index 8bb9660a..2251db90 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -245,6 +245,7 @@ exportMethods("+") exportMethods("-") exportMethods("/") exportMethods("==") +exportMethods("!=") exportMethods("[") exportMethods("[<-") exportMethods("[[") diff --git a/R/intervals.r b/R/intervals.r index 1c127832..469fbf00 100644 --- a/R/intervals.r +++ b/R/intervals.r @@ -676,6 +676,26 @@ setMethod("==", signature(e1 = "Interval", e2 = "Interval"), function(e1, e2) { int_start(e1) == int_start(e2) && int_end(e1) == int_end(e2) }) +#' Inequality check for Interval objects +#' +#' Check whether `e1` and `e2` have different start or end date-time objects. +#' +#' @param e1 An Interval object +#' @param e2 Another Interval object +#' @return TRUE if the start and end of `e1` do not match the start and end of `e1`, otherwise FALSE +#' @method != Interval +#' @export +#' @examples +#' int1 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) +#' int2 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) +#' int3 <- interval(as.Date("2021-01-02"), as.Date("2021-12-31")) +#' +#' int1 != int2 # FALSE +#' int1 != int3 # TRUE +setMethod("!=", signature(e1 = "Interval", e2 = "Interval"), function(e1, e2) { + int_start(e1) != int_start(e2) || int_end(e1) != int_end(e2) +}) + #' @export as.list.Interval <- function(x, ...) { lapply(seq_along(x), function(i) x[[i]]) From bc807f3063734c01949cc8b84eeb1e15a489f299 Mon Sep 17 00:00:00 2001 From: jakemanger Date: Fri, 1 Dec 2023 16:08:21 +0800 Subject: [PATCH 4/6] add vector tests with corrected support for vectors --- R/intervals.r | 10 ++++++++-- tests/testthat/test-intervals.R | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/R/intervals.r b/R/intervals.r index 469fbf00..c5b72ab1 100644 --- a/R/intervals.r +++ b/R/intervals.r @@ -672,8 +672,11 @@ setMethod("%within%", signature(a = "Interval", b = "list"), function(a, b) { #' #' int1 == int2 # TRUE #' int1 == int3 # FALSE +#' c(int1, int2) == c(int2, int3) # TRUE FALSE +#' int1 == c(int1, int2, int3) # TRUE TRUE FALSE +#' c(int1, int2, int3) == int1 # TRUE TRUE FALSE setMethod("==", signature(e1 = "Interval", e2 = "Interval"), function(e1, e2) { - int_start(e1) == int_start(e2) && int_end(e1) == int_end(e2) + int_start(e1) == int_start(e2) & int_end(e1) == int_end(e2) }) #' Inequality check for Interval objects @@ -692,8 +695,11 @@ setMethod("==", signature(e1 = "Interval", e2 = "Interval"), function(e1, e2) { #' #' int1 != int2 # FALSE #' int1 != int3 # TRUE +#' c(int1, int2) != c(int2, int3) # FALSE TRUE +#' int1 != c(int1, int2, int3) # FALSE FALSE TRUE +#' c(int1, int2, int3) != int1 # FALSE FALSE TRUE setMethod("!=", signature(e1 = "Interval", e2 = "Interval"), function(e1, e2) { - int_start(e1) != int_start(e2) || int_end(e1) != int_end(e2) + int_start(e1) != int_start(e2) | int_end(e1) != int_end(e2) }) #' @export diff --git a/tests/testthat/test-intervals.R b/tests/testthat/test-intervals.R index 0517fa55..f0abecda 100644 --- a/tests/testthat/test-intervals.R +++ b/tests/testthat/test-intervals.R @@ -888,7 +888,30 @@ test_that("Equality operator checks for matching start and end", { int1 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) int2 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) int3 <- interval(as.Date("2021-01-02"), as.Date("2021-12-31")) + int4 <- interval(as.Date("2020-12-31"), as.Date("2021-12-30")) expect_true(int1 == int2) expect_false(int1 == int3) + + expect_equal(c(int1, int2) == c(int2, int1), c(TRUE, TRUE)) + expect_equal(c(int1, int2) == c(int3, int4), c(FALSE, FALSE)) + expect_equal(c(int1, int2) == c(int2, int3), c(TRUE, FALSE)) + expect_equal(int1 == c(int1, int2, int3), c(TRUE, TRUE, FALSE)) + expect_equal(c(int1, int2, int3) == int1, c(TRUE, TRUE, FALSE)) +}) + +test_that("Inequality operator checks for non matching start and end", { + int1 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) + int2 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) + int3 <- interval(as.Date("2021-01-02"), as.Date("2021-12-31")) + int4 <- interval(as.Date("2020-12-31"), as.Date("2021-12-30")) + + expect_false(int1 != int2) + expect_true(int1 != int3) + + expect_equal(c(int1, int2) != c(int2, int1), c(FALSE, FALSE)) + expect_equal(c(int1, int2) != c(int3, int4), c(TRUE, TRUE)) + expect_equal(c(int1, int2) != c(int2, int3), c(FALSE, TRUE)) + expect_equal(int1 != c(int1, int2, int3), c(FALSE, FALSE, TRUE)) + expect_equal(c(int1, int2, int3) != int1, c(FALSE, FALSE, TRUE)) }) From 7ee64dd6f32cba1b98764ec672c58fe167d41120 Mon Sep 17 00:00:00 2001 From: jakemanger Date: Fri, 1 Dec 2023 16:17:18 +0800 Subject: [PATCH 5/6] add missing pckdown index --- _pkgdown.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_pkgdown.yml b/_pkgdown.yml index 86bcc00f..1a672f1c 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -80,6 +80,8 @@ reference: - as.interval - "`%within%`" - Interval-class + - "`==`" + - "`!=`" - title: Timespans desc: > From 9f34e6955a14b59aee1b1e7dc23689af1c80fce5 Mon Sep 17 00:00:00 2001 From: jakemanger Date: Fri, 1 Dec 2023 16:46:25 +0800 Subject: [PATCH 6/6] attempt to fix pkgdown naming and add man files --- _pkgdown.yml | 4 +-- man/equals-Interval-Interval-method.Rd | 3 +++ man/not-equals-Interval-Interval-method.Rd | 30 ++++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 man/not-equals-Interval-Interval-method.Rd diff --git a/_pkgdown.yml b/_pkgdown.yml index 1a672f1c..b00c0fb6 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -80,8 +80,8 @@ reference: - as.interval - "`%within%`" - Interval-class - - "`==`" - - "`!=`" + - "`==,Interval,Interval-method`" + - "`!=,Interval,Interval-method`" - title: Timespans desc: > diff --git a/man/equals-Interval-Interval-method.Rd b/man/equals-Interval-Interval-method.Rd index 2abb90b7..ad387c10 100644 --- a/man/equals-Interval-Interval-method.Rd +++ b/man/equals-Interval-Interval-method.Rd @@ -24,4 +24,7 @@ int3 <- interval(as.Date("2021-01-02"), as.Date("2021-12-31")) int1 == int2 # TRUE int1 == int3 # FALSE +c(int1, int2) == c(int2, int3) # TRUE FALSE +int1 == c(int1, int2, int3) # TRUE TRUE FALSE +c(int1, int2, int3) == int1 # TRUE TRUE FALSE } diff --git a/man/not-equals-Interval-Interval-method.Rd b/man/not-equals-Interval-Interval-method.Rd new file mode 100644 index 00000000..b08a124d --- /dev/null +++ b/man/not-equals-Interval-Interval-method.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/intervals.r +\name{!=,Interval,Interval-method} +\alias{!=,Interval,Interval-method} +\title{Inequality check for Interval objects} +\usage{ +\S4method{!=}{Interval,Interval}(e1, e2) +} +\arguments{ +\item{e1}{An Interval object} + +\item{e2}{Another Interval object} +} +\value{ +TRUE if the start and end of \code{e1} do not match the start and end of \code{e1}, otherwise FALSE +} +\description{ +Check whether \code{e1} and \code{e2} have different start or end date-time objects. +} +\examples{ +int1 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) +int2 <- interval(as.Date("2021-01-01"), as.Date("2021-12-30")) +int3 <- interval(as.Date("2021-01-02"), as.Date("2021-12-31")) + +int1 != int2 # FALSE +int1 != int3 # TRUE +c(int1, int2) != c(int2, int3) # FALSE TRUE +int1 != c(int1, int2, int3) # FALSE FALSE TRUE +c(int1, int2, int3) != int1 # FALSE FALSE TRUE +}