From 7a3b601ccad1921522fddc4c7fe6295641339b80 Mon Sep 17 00:00:00 2001 From: hadley Date: Mon, 10 Sep 2018 16:44:46 -0500 Subject: [PATCH 1/4] Don't export generated S4 generics --- NAMESPACE | 3 --- R/intervals.r | 3 --- 2 files changed, 6 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 7dbc70fa..7a1e27f9 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -143,7 +143,6 @@ export(int_overlaps) export(int_shift) export(int_standardize) export(int_start) -export(intersect) export(interval) export(is.Date) export(is.POSIXct) @@ -200,14 +199,12 @@ export(second) export(seconds) export(seconds_to_period) export(semester) -export(setdiff) export(stamp) export(stamp_date) export(stamp_time) export(time_length) export(today) export(tz) -export(union) export(wday) export(week) export(weeks) diff --git a/R/intervals.r b/R/intervals.r index 1e01aa31..8de28285 100644 --- a/R/intervals.r +++ b/R/intervals.r @@ -431,7 +431,6 @@ int_diff <- function(times) { interval(times[-length(times)], times[-1]) } -#' @export setGeneric("intersect") #' @export @@ -454,7 +453,6 @@ setMethod("intersect", signature(x = "Interval", y = "Interval"), function(x, y) new.int }) -#' @export setGeneric("union") #' @export @@ -476,7 +474,6 @@ setMethod("union", signature(x = "Interval", y = "Interval"), function(x, y) { new.int }) -#' @export setGeneric("setdiff") # returns the part of x that is not in y From f510fcb7ab6bd5d2d51a743a686dbd0358b75969 Mon Sep 17 00:00:00 2001 From: hadley Date: Wed, 12 Sep 2018 07:19:30 -0500 Subject: [PATCH 2/4] Dont export as.difftime generic --- NAMESPACE | 1 - R/coercion.r | 1 - 2 files changed, 2 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 7a1e27f9..20adfbfa 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -80,7 +80,6 @@ export(NA_POSIXct_) export(POSIXct) export(add_with_rollback) export(am) -export(as.difftime) export(as.duration) export(as.interval) export(as.period) diff --git a/R/coercion.r b/R/coercion.r index bbcc7232..f3f2d944 100644 --- a/R/coercion.r +++ b/R/coercion.r @@ -524,7 +524,6 @@ setMethod("as.period", signature("logical"), function(x, unit = NULL, ...) { as.period(as.numeric(x), unit, ...) }) -#' @export setGeneric("as.difftime") #' @export From aeb344ba0d0025d18285bed3dd620474253a14a5 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Sun, 24 Nov 2019 12:55:36 -0600 Subject: [PATCH 3/4] Extend functions in generics package --- DESCRIPTION | 1 + NAMESPACE | 3 +++ R/intervals.r | 14 +++++++------- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4a7d1414..72069eba 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -52,6 +52,7 @@ Depends: methods, R (>= 3.2) Imports: + generics, Rcpp (>= 0.12.13) Suggests: covr, diff --git a/NAMESPACE b/NAMESPACE index 994771cf..fee02c60 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -247,6 +247,9 @@ exportMethods(setdiff) exportMethods(show) exportMethods(union) importFrom(Rcpp,sourceCpp) +importFrom(generics,intersect) +importFrom(generics,setdiff) +importFrom(generics,union) importFrom(methods,"coerce<-") importFrom(methods,"slot<-") importFrom(methods,Arith) diff --git a/R/intervals.r b/R/intervals.r index cde23f21..018137a0 100644 --- a/R/intervals.r +++ b/R/intervals.r @@ -437,7 +437,8 @@ int_diff <- function(times) { interval(times[-length(times)], times[-1]) } -setGeneric("intersect") +#' @importFrom generics intersect +setGeneric("intersect", package = "generics") #' @export setMethod("intersect", signature(x = "Interval", y = "Interval"), function(x, y) { @@ -459,7 +460,8 @@ setMethod("intersect", signature(x = "Interval", y = "Interval"), function(x, y) new.int }) -setGeneric("union") +#' @importFrom generics union +setGeneric("union", package = "generics") #' @export setMethod("union", signature(x = "Interval", y = "Interval"), function(x, y) { @@ -480,7 +482,8 @@ setMethod("union", signature(x = "Interval", y = "Interval"), function(x, y) { new.int }) -setGeneric("setdiff") +#' @importFrom generics setdiff +setGeneric("setdiff", package = "generics") # returns the part of x that is not in y #' @export @@ -557,10 +560,7 @@ setMethod("setdiff", signature(x = "Interval", y = "Interval"), function(x, y) { #' blackouts<- list(interval(ymd("2014-12-30"), ymd("2014-12-31")), #' interval(ymd("2014-12-30"), ymd("2015-01-03"))) #' dates %within% blackouts -"%within%" <- function(a, b) standardGeneric("%within%") - -#' @export -setGeneric("%within%") +setGeneric("%within%", function(a, b) standardGeneric("%within%")) .within <- function(a, int) { as.numeric(a) - as.numeric(int@start) <= int@.Data & as.numeric(a) - as.numeric(int@start) >= 0 From bab022ae72d073128d4e29b42bcef757216e8b86 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Sun, 24 Nov 2019 14:44:52 -0600 Subject: [PATCH 4/4] Re-export set operations from generics And use S3 methods instead of S4 --- NAMESPACE | 9 ++++++--- R/intervals.r | 23 +++++++++++++---------- man/reexports.Rd | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 man/reexports.Rd diff --git a/NAMESPACE b/NAMESPACE index fee02c60..e3c87a92 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -22,6 +22,7 @@ S3method(format,Interval) S3method(format,Period) S3method(hour,Period) S3method(hour,default) +S3method(intersect,Interval) S3method(mday,Period) S3method(mday,default) S3method(minute,Period) @@ -39,6 +40,7 @@ S3method(reclass_date,ti) S3method(reclass_date,timeDate) S3method(second,Period) S3method(second,default) +S3method(setdiff,Interval) S3method(summary,Duration) S3method(summary,Interval) S3method(summary,Period) @@ -46,6 +48,7 @@ S3method(tz,default) S3method(tz,irts) S3method(tz,timeSeries) S3method(tz,zoo) +S3method(union,Interval) S3method(unique,Interval) S3method(update,Date) S3method(update,POSIXt) @@ -132,6 +135,7 @@ export(int_overlaps) export(int_shift) export(int_standardize) export(int_start) +export(intersect) export(interval) export(is.Date) export(is.POSIXct) @@ -183,12 +187,14 @@ export(second) export(seconds) export(seconds_to_period) export(semester) +export(setdiff) export(stamp) export(stamp_date) export(stamp_time) export(time_length) export(today) export(tz) +export(union) export(wday) export(week) export(weeks) @@ -240,12 +246,9 @@ exportMethods(as_date) exportMethods(as_datetime) exportMethods(c) exportMethods(format_ISO8601) -exportMethods(intersect) exportMethods(reclass_timespan) exportMethods(rep) -exportMethods(setdiff) exportMethods(show) -exportMethods(union) importFrom(Rcpp,sourceCpp) importFrom(generics,intersect) importFrom(generics,setdiff) diff --git a/R/intervals.r b/R/intervals.r index 018137a0..98903b10 100644 --- a/R/intervals.r +++ b/R/intervals.r @@ -437,11 +437,13 @@ int_diff <- function(times) { interval(times[-length(times)], times[-1]) } + #' @importFrom generics intersect -setGeneric("intersect", package = "generics") +#' @export +generics::intersect #' @export -setMethod("intersect", signature(x = "Interval", y = "Interval"), function(x, y) { +intersect.Interval <- function(x, y, ...) { int1 <- int_standardize(x) int2 <- int_standardize(y) @@ -458,13 +460,14 @@ setMethod("intersect", signature(x = "Interval", y = "Interval"), function(x, y) negix <- !is.na(x@.Data) & (sign(x@.Data) == -1) new.int[negix] <- int_flip(new.int[negix]) new.int -}) +} #' @importFrom generics union -setGeneric("union", package = "generics") +#' @export +generics::union #' @export -setMethod("union", signature(x = "Interval", y = "Interval"), function(x, y) { +union.Interval <- function(x, y, ...) { int1 <- int_standardize(x) int2 <- int_standardize(y) @@ -480,14 +483,14 @@ setMethod("union", signature(x = "Interval", y = "Interval"), function(x, y) { new.int <- new("Interval", spans, start = starts, tzone = x@tzone) new.int[sign(x@.Data) == -1] <- int_flip(new.int[sign(x@.Data) == -1]) new.int -}) +} #' @importFrom generics setdiff -setGeneric("setdiff", package = "generics") +#' @export +generics::setdiff -# returns the part of x that is not in y #' @export -setMethod("setdiff", signature(x = "Interval", y = "Interval"), function(x, y) { +setdiff.Interval <- function(x, y, ...) { if (length(x) != length(y)) { xy <- match_lengths(x, y) @@ -522,7 +525,7 @@ setMethod("setdiff", signature(x = "Interval", y = "Interval"), function(x, y) { new.int <- new("Interval", spans, start = starts, tzone = x@tzone) new.int[sign(x@.Data) == -1] <- int_flip(new.int[sign(x@.Data) == -1]) new.int -}) +} #' Does a date (or interval) fall within an interval? diff --git a/man/reexports.Rd b/man/reexports.Rd new file mode 100644 index 00000000..330d189e --- /dev/null +++ b/man/reexports.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/intervals.r +\docType{import} +\name{reexports} +\alias{reexports} +\alias{intersect} +\alias{union} +\alias{setdiff} +\title{Objects exported from other packages} +\keyword{internal} +\description{ +These objects are imported from other packages. Follow the links +below to see their documentation. + +\describe{ + \item{generics}{\code{\link[generics]{intersect}}, \code{\link[generics]{setdiff}}, \code{\link[generics]{union}}} +}} +