From 775c0fc469d8b30806984d0342b7ff1a5de92f6d Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 12 Jun 2024 16:43:46 -0700 Subject: [PATCH 001/110] Clean up unused assignment --- R/grouped_epi_archive.R | 7 ------- 1 file changed, 7 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 55a0176c..43916ccf 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -277,13 +277,6 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, # Carry out the specified computation comp_value <- f(.data_group, .group_key, ref_time_value, ...) - if (all_versions) { - # Extract data from archive so we can do length checks below. When - # `all_versions = TRUE`, `.data_group` will always be an ungrouped - # archive because of the preceding `epix_as_of` step. - .data_group <- .data_group$DT - } - assert( check_atomic(comp_value, any.missing = TRUE), check_data_frame(comp_value), From 3d4e4980b89f92b74b36ef861a54784a1942d00a Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 19 Jun 2024 13:18:14 -0700 Subject: [PATCH 002/110] fix(epix_slide): don't serialize object in error message Resolves #429. --- R/grouped_epi_archive.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 43916ccf..d6f7733f 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -281,7 +281,7 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, check_atomic(comp_value, any.missing = TRUE), check_data_frame(comp_value), combine = "or", - .var.name = vname(comp_value) + .var.name = "comp_value (an output of one of your slide computations)" ) # Label every result row with the `ref_time_value` From e0188ce0f37126ab68a720eecafafb6030af379a Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 21 Jun 2024 17:57:48 -0700 Subject: [PATCH 003/110] Mention trailing commas as possible cause of slide ... error --- R/utils.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index a7f7649f..1e1dc440 100644 --- a/R/utils.R +++ b/R/utils.R @@ -321,7 +321,8 @@ as_slide_computation <- function(f, ...) { if (rlang::dots_n(...) > 0L) { cli_abort( "No arguments can be passed via `...` when `f` is a formula, or there - are unrecognized/misspelled parameter names.", + are unrecognized/misspelled parameter names, or there is a trailing + comma in the `epi[x]_slide()` call.", class = "epiprocess__as_slide_computation__formula_with_dots", epiprocess__f = f, epiprocess__enquos_dots = enquos(...) From 607e8e74f474e4e273c461021ab79c2724705a24 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Tue, 25 Jun 2024 19:07:23 -0700 Subject: [PATCH 004/110] WIP (to rebase): match data-masking outputs, deprecate competing parms --- DESCRIPTION | 2 +- NAMESPACE | 1 + R/epiprocess.R | 1 + R/grouped_epi_archive.R | 29 ++++---- R/methods-epi_archive.R | 9 ++- R/slide.R | 118 ++++++++++++++++---------------- R/utils.R | 72 ++++++++++++++++--- man/epi_slide.Rd | 30 ++++---- man/epi_slide_mean.Rd | 31 ++++----- man/epi_slide_opt.Rd | 18 ++--- man/epi_slide_sum.Rd | 18 ++--- man/epix_slide.Rd | 2 +- tests/testthat/test-epi_slide.R | 30 ++++---- 13 files changed, 207 insertions(+), 154 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0c871dca..f35681f6 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: epiprocess Title: Tools for basic signal processing in epidemiology -Version: 0.7.11 +Version: 0.7.12 Authors@R: c( person("Jacob", "Bien", role = "ctb"), person("Logan", "Brooks", email = "lcbrooks@andrew.cmu.edu", role = c("aut", "cre")), diff --git a/NAMESPACE b/NAMESPACE index 1362b15c..cda38676 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -139,6 +139,7 @@ importFrom(dplyr,slice) importFrom(dplyr,tibble) importFrom(dplyr,ungroup) importFrom(ggplot2,autoplot) +importFrom(lifecycle,deprecated) importFrom(lubridate,as.period) importFrom(lubridate,days) importFrom(lubridate,weeks) diff --git a/R/epiprocess.R b/R/epiprocess.R index dd7df87a..691be911 100644 --- a/R/epiprocess.R +++ b/R/epiprocess.R @@ -10,6 +10,7 @@ #' anyInfinite test_subset test_set_equal checkInt expect_class #' @importFrom cli cli_abort cli_warn #' @importFrom rlang %||% +#' @importFrom lifecycle deprecated #' @name epiprocess "_PACKAGE" utils::globalVariables(c(".x", ".group_key", ".ref_time_value")) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index d6f7733f..50224720 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -205,9 +205,9 @@ ungroup.grouped_epi_archive <- function(x, ...) { #' env missing_arg #' @export epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, - time_step, new_col_name = "slide_value", - as_list_col = FALSE, names_sep = "_", - all_versions = FALSE) { + time_step, new_col_name = NULL, + all_versions = FALSE, + as_list_col = deprecated(), names_sep = deprecated()) { # Perform some deprecated argument checks without using ` = # deprecated()` in the function signature, because they are from # early development versions and much more likely to be clutter than @@ -261,13 +261,16 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, if (!missing(time_step)) before <- time_step(before) - # Symbolize column name - new_col <- sym(new_col_name) - # Validate rest of parameters: - assert_logical(as_list_col, len = 1L) assert_logical(all_versions, len = 1L) - assert_character(names_sep, len = 1L, null.ok = TRUE) + + if (lifecycle::is_present(as_list_col)) { + lifecycle::deprecate_stop("0.7.12", "epix_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead.") + } + + if (lifecycle::is_present(names_sep)) { + lifecycle::deprecate_stop("0.7.12", "epix_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + } # Computation for one group, one time value comp_one_grp <- function(.data_group, .group_key, @@ -300,16 +303,12 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, # If `f` is missing, interpret ... as an expression for tidy evaluation if (missing(f)) { - quos <- enquos(...) - if (length(quos) == 0) { + quosures <- enquos(...) + if (length(quosures) == 0) { cli_abort("If `f` is missing then a computation must be specified via `...`.") } - if (length(quos) > 1) { - cli_abort("If `f` is missing then only a single computation can be specified via `...`.") - } - f <- quos[[1]] - new_col <- sym(names(rlang::quos_auto_name(quos))) + f <- as_slide_computation(f, new_col_name) ... <- missing_arg() # nolint: object_usage_linter. magic value that passes zero args as dots in calls below } diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index 891cc064..2d2f6a3d 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -794,9 +794,8 @@ epix_slide <- function( ref_time_values, time_step, new_col_name = "slide_value", - as_list_col = FALSE, - names_sep = "_", - all_versions = FALSE) { + all_versions = FALSE, + as_list_col = deprecated(), names_sep = deprecated()) { UseMethod("epix_slide") } @@ -805,8 +804,8 @@ epix_slide <- function( #' @export epix_slide.epi_archive <- function(x, f, ..., before, ref_time_values, time_step, new_col_name = "slide_value", - as_list_col = FALSE, names_sep = "_", - all_versions = FALSE) { + all_versions = FALSE, + as_list_col = deprecated(), names_sep = deprecated()) { # For an "ungrouped" slide, treat all rows as belonging to one big # group (group by 0 vars), like `dplyr::summarize`, and let the # resulting `grouped_epi_archive` handle the slide: diff --git a/R/slide.R b/R/slide.R index 27a3135c..3a7c915a 100644 --- a/R/slide.R +++ b/R/slide.R @@ -132,8 +132,8 @@ #' ungroup() epi_slide <- function(x, f, ..., before, after, ref_time_values, time_step, - new_col_name = "slide_value", as_list_col = FALSE, - names_sep = "_", all_rows = FALSE) { + new_col_name = NULL, all_rows = FALSE, + as_list_col = deprecated(), names_sep = deprecated()) { assert_class(x, "epi_df") if (missing(ref_time_values)) { @@ -186,6 +186,14 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, after <- time_step(after) } + if (lifecycle::is_present(as_list_col)) { + lifecycle::deprecate_stop("0.7.12", "epi_slide_opt(as_list_col =)") + } + + if (lifecycle::is_present(names_sep)) { + lifecycle::deprecate_stop("0.7.12", "epi_slide_opt(names_sep =)") + } + # Arrange by increasing time_value x <- arrange(x, .data$time_value) @@ -193,9 +201,6 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, starts <- ref_time_values - before stops <- ref_time_values + after - # Symbolize new column name - new_col <- sym(new_col_name) - # Computation for one group, all time values slide_one_grp <- function(.data_group, .group_key, # see `?group_modify` @@ -205,7 +210,7 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, stops, ref_time_values, all_rows, - new_col) { + new_col_name) { # Figure out which reference time values appear in the data group in the # first place (we need to do this because it could differ based on the # group, hence the setup/checks for the reference time values based on all @@ -227,6 +232,20 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, .group_key, ... ) + # If this wasn't a tidyeval computation, we still need to check the output + # types. We'll let `list_unchop` deal with checking for type compatibility + # between the outputs. + if (!rlang::is_quosures(f) && + !all(vapply(slide_values_list, function(x) { + vctrs::obj_is_vector(x) && is.null(vctrs::vec_names(x)) + }, logical(1L))) + ) { + cli_abort( + "The slide computations must return always atomic vectors + or data frames (and not a mix of these two structures)." + ) + } + # Now figure out which rows in the data group are in the reference time # values; this will be useful for all sorts of checks that follow o <- .data_group$time_value %in% kept_ref_time_values @@ -237,23 +256,7 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, dplyr::count(.data$time_value) %>% `[[`("n") - if ( - !all(purrr::map_lgl(slide_values_list, is.atomic)) && - !all(purrr::map_lgl(slide_values_list, is.data.frame)) - ) { - cli_abort( - "The slide computations must return always atomic vectors - or data frames (and not a mix of these two structures)." - ) - } - - # Unlist if appropriate: - slide_values <- - if (as_list_col) { - slide_values_list - } else { - vctrs::list_unchop(slide_values_list) - } + slide_values <- vctrs::list_unchop(slide_values_list) if ( all(purrr::map_int(slide_values_list, vctrs::vec_size) == 1L) && @@ -264,13 +267,7 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, # leave it to the next branch, where it also belongs.) slide_values <- vctrs::vec_rep_each(slide_values, times = counts) } else { - # Split and flatten if appropriate, perform a (loose) check on number of - # rows. - if (as_list_col) { - slide_values <- purrr::list_flatten(purrr::map( - slide_values, ~ vctrs::vec_split(.x, seq_len(vctrs::vec_size(.x)))[["val"]] - )) - } + # (Loose) check on number of rows: if (vctrs::vec_size(slide_values) != num_ref_rows) { cli_abort( "The slide computations must either (a) output a single element/row each, or @@ -283,13 +280,26 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, if (all_rows) { orig_values <- slide_values slide_values <- vctrs::vec_rep(vctrs::vec_cast(NA, orig_values), nrow(.data_group)) - # ^ using vctrs::vec_init would be shorter but docs don't guarantee it - # fills with NA equivalent. vctrs::vec_slice(slide_values, o) <- orig_values } else { .data_group <- filter(.data_group, o) } - return(mutate(.data_group, !!new_col := slide_values)) + + result = + if (!is.null(new_col_name)) { + # vector or packed data.frame-type column: + mutate(.data_group, !!new_col_name := slide_values) + } else { + if (is.data.frame(slide_values)) { + # unpack into separate columns (without name prefix): + mutate(.data_group, slide_values) + } else { + # apply default name: + mutate(.data_group, slide_value = slide_values) + } + } + + return(result) } # If `f` is missing, interpret ... as an expression for tidy evaluation @@ -302,8 +312,7 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, cli_abort("If `f` is missing then only a single computation can be specified via `...`.") } - f <- quos[[1]] - new_col <- sym(names(rlang::quos_auto_name(quos))) + f <- quos ... <- missing_arg() # magic value that passes zero args as dots in calls below # nolint: object_usage_linter } @@ -328,15 +337,10 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, stops = stops, ref_time_values = ref_time_values, all_rows = all_rows, - new_col = new_col, + new_col_name = new_col_name, .keep = FALSE ) - # Unnest if we need to, and return - if (!as_list_col) { - x <- unnest(x, !!new_col, names_sep = names_sep) - } - return(x) } @@ -433,8 +437,8 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, #' ungroup() epi_slide_opt <- function(x, col_names, f, ..., before, after, ref_time_values, time_step, - new_col_name = NULL, as_list_col = NULL, - names_sep = NULL, all_rows = FALSE) { + new_col_name = NULL, all_rows = FALSE, + as_list_col = deprecated(), names_sep = deprecated()) { assert_class(x, "epi_df") if (nrow(x) == 0L) { @@ -449,23 +453,19 @@ epi_slide_opt <- function(x, col_names, f, ..., before, after, ref_time_values, ) } - if (!is.null(as_list_col)) { - cli_abort( - "`as_list_col` is not supported for `epi_slide_[opt/mean/sum]`", - class = "epiprocess__epi_slide_opt__list_not_supported" - ) - } if (!is.null(new_col_name)) { cli_abort( "`new_col_name` is not supported for `epi_slide_[opt/mean/sum]`", class = "epiprocess__epi_slide_opt__new_name_not_supported" ) } - if (!is.null(names_sep)) { - cli_abort( - "`names_sep` is not supported for `epi_slide_[opt/mean/sum]`", - class = "epiprocess__epi_slide_opt__name_sep_not_supported" - ) + + if (lifecycle::is_present(as_list_col)) { + lifecycle::deprecate_stop("0.7.12", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate.") + } + + if (lifecycle::is_present(names_sep)) { + lifecycle::deprecate_stop("0.7.12", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") } # Check that slide function `f` is one of those short-listed from @@ -724,8 +724,8 @@ epi_slide_opt <- function(x, col_names, f, ..., before, after, ref_time_values, #' ungroup() epi_slide_mean <- function(x, col_names, ..., before, after, ref_time_values, time_step, - new_col_name = NULL, as_list_col = NULL, - names_sep = NULL, all_rows = FALSE) { + new_col_name = NULL, all_rows = FALSE, + as_list_col = deprecated(), names_sep = deprecated()) { epi_slide_opt( x = x, col_names = {{ col_names }}, @@ -771,8 +771,10 @@ epi_slide_mean <- function(x, col_names, ..., before, after, ref_time_values, #' ungroup() epi_slide_sum <- function(x, col_names, ..., before, after, ref_time_values, time_step, - new_col_name = NULL, as_list_col = NULL, - names_sep = NULL, all_rows = FALSE) { + new_col_name = NULL, + all_rows = FALSE, + as_list_col = deprecated(), + names_sep = deprecated()) { epi_slide_opt( x = x, col_names = {{ col_names }}, diff --git a/R/utils.R b/R/utils.R index 1e1dc440..bdfc03e4 100644 --- a/R/utils.R +++ b/R/utils.R @@ -283,22 +283,70 @@ as_slide_computation <- function(f, ...) { arg <- caller_arg(f) call <- caller_env() - # A quosure is a type of formula, so be careful with the order and contents - # of the conditional logic here. - if (is_quosure(f)) { + if (rlang::is_quosures(f)) { + quosures <- rlang::quos_auto_name(f) # resolves := among other things + nms <- names(quosures) + manually_named <- + rlang::names2(f) != "" | + vapply(f, function(quosure) { + expression <- rlang::quo_get_expr(quosure) + is.call(expression) && expression[[1L]] == rlang::sym(":=") + }, FUN.VALUE = logical(1L)) fn <- function(.x, .group_key, .ref_time_value) { - # Convert to environment to standardize between tibble and R6 - # based inputs. In both cases, we should get a simple - # environment with the empty environment as its parent. - data_env <- rlang::as_environment(.x) - data_mask <- rlang::new_data_mask(bottom = data_env, top = data_env) + x_as_env <- rlang::as_environment(.x) + results_env <- new.env(parent = x_as_env) + data_mask <- rlang::new_data_mask(bottom = results_env, top = x_as_env) data_mask$.data <- rlang::as_data_pronoun(data_mask) # We'll also install `.x` directly, not as an `rlang_data_pronoun`, so - # that we can, e.g., use more dplyr and epiprocess operations. + # that we can, e.g., use more dplyr and epiprocess operations. It won't be + # (and doesn't make sense nrow-wise to be) updated with results as we loop + # through the quosures. data_mask$.x <- .x data_mask$.group_key <- .group_key data_mask$.ref_time_value <- .ref_time_value - rlang::eval_tidy(f, data_mask) + common_size <- NULL + results_names <- character(0L) # track ordering; env doesn't + for (quosure_i in seq_along(f)) { + # XXX could capture and improve error messages here at cost of recover()ability + quosure_result_raw <- rlang::eval_tidy(quosures[[quosure_i]], data_mask) + if (is.null(quosure_result_raw)) { + nm <- nms[[quosure_i]] + results_names <- results_names[results_names != nm] + remove(list = nm, envir = results_env) + } else if (vctrs::obj_is_vector(quosure_result_raw) && + is.null(vctrs::vec_names(quosure_result_raw))) { + # We want something like `dplyr_col_modify()` but allowing recycling + # of previous computations and updating `results_env` and unpacking + # tibbles if not manually named. + if (!is.null(common_size)) { + # XXX could improve error messages here + quosure_result_recycled <- vctrs::vec_recycle(quosure_result_raw, common_size) + } else { + quosure_result_recycled <- quosure_result_raw + quosure_result_size <- vctrs::vec_size(quosure_result_raw) + if (quosure_result_size != 1L) { + common_size <- quosure_result_size + for (previous_result_nm in names(results_env)) { + results_env[[previous_result_nm]] <- vctrs::vec_recycle(results_env[[previous_result_nm]], common_size) + } + } # else `common_size` remains NULL + } + if (is.data.frame(quosure_result_recycled) && !manually_named[[i]]) { + new_results_names <- names(quosure_result_recycled) + results_names <- c(results_names, new_results_names) + for (new_result_i in seq_along(quosure_result_recycled)) { + results_env[[new_result_i]] <- quosure_result_recycled[[new_result_i]] + } + } else { + nm <- nms[[quosure_i]] + results_names <- c(results_names, nm) + results_env[[nm]] <- quosure_result_recycled + } + } else { + cli_abort("Problem with output of {.code {rlang::expr_deparse(rlang::quo_get_expr(f[[quosure_i]]))}}; it produced a result that was neither NULL, a data.frame, nor a vector without unnamed entries (as determined by the vctrs package).") + } + } + validate_tibble(new_tibble(as.list(results_env)[results_names])) } return(fn) @@ -311,6 +359,10 @@ as_slide_computation <- function(f, ...) { } if (is_formula(f)) { + if (is_quosure(f)) { + cli_abort("`f` argument to `as_slide_computation()` cannot be a `quosure`; it should probably be a `quosures`. This is likely an internal bug in `{{epiprocess}}`.") + } + if (length(f) > 2) { cli_abort("{.code {arg}} must be a one-sided formula", class = "epiprocess__as_slide_computation__formula_is_twosided", diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index a1319f99..f7756103 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -12,10 +12,10 @@ epi_slide( after, ref_time_values, time_step, - new_col_name = "slide_value", - as_list_col = FALSE, - names_sep = "_", - all_rows = FALSE + new_col_name = NULL, + all_rows = FALSE, + as_list_col = deprecated(), + names_sep = deprecated() ) } \arguments{ @@ -80,17 +80,6 @@ return an object of class \link[lubridate:period]{lubridate::period}. For exampl contain the derivative values. Default is "slide_value"; note that setting \code{new_col_name} equal to an existing column name will overwrite this column.} -\item{as_list_col}{Should the slide results be held in a list column, or be -\link[tidyr:chop]{unchopped}/\link[tidyr:unnest]{unnested}? Default is \code{FALSE}, -in which case a list object returned by \code{f} would be unnested (using -\code{\link[tidyr:unnest]{tidyr::unnest()}}), and, if the slide computations output data frames, -the names of the resulting columns are given by prepending \code{new_col_name} -to the names of the list elements.} - -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} - \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in the output even with \code{ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s @@ -101,6 +90,17 @@ of the slide computation output. If using \code{as_list_col = TRUE}, note that the missing marker is a \code{NULL} entry in the list column; for certain operations, you might want to replace these \code{NULL} entries with a different \code{NA} marker.} + +\item{as_list_col}{Should the slide results be held in a list column, or be +\link[tidyr:chop]{unchopped}/\link[tidyr:unnest]{unnested}? Default is \code{FALSE}, +in which case a list object returned by \code{f} would be unnested (using +\code{\link[tidyr:unnest]{tidyr::unnest()}}), and, if the slide computations output data frames, +the names of the resulting columns are given by prepending \code{new_col_name} +to the names of the list elements.} + +\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} +when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix +from \code{new_col_name} entirely.} } \value{ An \code{epi_df} object given by appending one or more new columns to diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index 850a45a1..8b28b60d 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -12,10 +12,9 @@ epi_slide_mean( after, ref_time_values, time_step, - new_col_name = NULL, - as_list_col = NULL, - names_sep = NULL, - all_rows = FALSE + all_rows = FALSE, + as_list_col = deprecated(), + names_sep = deprecated() ) } \arguments{ @@ -70,18 +69,6 @@ return an object of class \link[lubridate:period]{lubridate::period}. For exampl \code{time_step = lubridate::hours} in order to set the time step to be one hour (this would only be meaningful if \code{time_value} is of class \code{POSIXct}).} -\item{new_col_name}{Character vector indicating the name(s) of the new -column(s) that will contain the derivative values. Default -is "slide_value"; note that setting \code{new_col_name} equal to any existing -column names will overwrite those columns. If \code{names_sep} is \code{NULL}, -\code{new_col_name} must be the same length as \code{col_names}.} - -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} - \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in the output even with \code{ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s @@ -92,6 +79,18 @@ of the slide computation output. If using \code{as_list_col = TRUE}, note that the missing marker is a \code{NULL} entry in the list column; for certain operations, you might want to replace these \code{NULL} entries with a different \code{NA} marker.} + +\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} + +\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} +when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix +from \code{new_col_name} entirely.} + +\item{new_col_name}{Character vector indicating the name(s) of the new +column(s) that will contain the derivative values. Default +is "slide_value"; note that setting \code{new_col_name} equal to any existing +column names will overwrite those columns. If \code{names_sep} is \code{NULL}, +\code{new_col_name} must be the same length as \code{col_names}.} } \value{ An \code{epi_df} object given by appending one or more new columns to diff --git a/man/epi_slide_opt.Rd b/man/epi_slide_opt.Rd index 4b011c16..60aa1fd7 100644 --- a/man/epi_slide_opt.Rd +++ b/man/epi_slide_opt.Rd @@ -14,9 +14,9 @@ epi_slide_opt( ref_time_values, time_step, new_col_name = NULL, - as_list_col = NULL, - names_sep = NULL, - all_rows = FALSE + all_rows = FALSE, + as_list_col = deprecated(), + names_sep = deprecated() ) } \arguments{ @@ -97,12 +97,6 @@ is "slide_value"; note that setting \code{new_col_name} equal to any existing column names will overwrite those columns. If \code{names_sep} is \code{NULL}, \code{new_col_name} must be the same length as \code{col_names}.} -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} - \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in the output even with \code{ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s @@ -113,6 +107,12 @@ of the slide computation output. If using \code{as_list_col = TRUE}, note that the missing marker is a \code{NULL} entry in the list column; for certain operations, you might want to replace these \code{NULL} entries with a different \code{NA} marker.} + +\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} + +\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} +when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix +from \code{new_col_name} entirely.} } \value{ An \code{epi_df} object given by appending one or more new columns to diff --git a/man/epi_slide_sum.Rd b/man/epi_slide_sum.Rd index 8c835bdb..ec8344b4 100644 --- a/man/epi_slide_sum.Rd +++ b/man/epi_slide_sum.Rd @@ -13,9 +13,9 @@ epi_slide_sum( ref_time_values, time_step, new_col_name = NULL, - as_list_col = NULL, - names_sep = NULL, - all_rows = FALSE + all_rows = FALSE, + as_list_col = deprecated(), + names_sep = deprecated() ) } \arguments{ @@ -76,12 +76,6 @@ is "slide_value"; note that setting \code{new_col_name} equal to any existing column names will overwrite those columns. If \code{names_sep} is \code{NULL}, \code{new_col_name} must be the same length as \code{col_names}.} -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} - \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in the output even with \code{ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s @@ -92,6 +86,12 @@ of the slide computation output. If using \code{as_list_col = TRUE}, note that the missing marker is a \code{NULL} entry in the list column; for certain operations, you might want to replace these \code{NULL} entries with a different \code{NA} marker.} + +\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} + +\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} +when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix +from \code{new_col_name} entirely.} } \value{ An \code{epi_df} object given by appending one or more new columns to diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index c8f09594..9e7bda76 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -39,7 +39,7 @@ epix_slide( before, ref_time_values, time_step, - new_col_name = "slide_value", + new_col_name = NULL, as_list_col = FALSE, names_sep = "_", all_versions = FALSE diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 8765d50c..30b9a47d 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -18,7 +18,7 @@ small_x <- dplyr::bind_rows( group_by(geo_value) -f <- function(x, g, t) dplyr::tibble(value = mean(x$value), count = length(x$value)) +f <- function(x, g, t) dplyr::tibble(avg = mean(x$value), count = length(x$value)) toy_edf <- tibble::tribble( ~geo_value, ~time_value, ~value, @@ -128,9 +128,9 @@ test_that("Test errors/warnings for discouraged features", { ) # Results from epi_slide and epi_slide_mean should match - expect_identical(select(ref1, -slide_value_count), opt1) - expect_identical(select(ref2, -slide_value_count), opt2) - expect_identical(select(ref3, -slide_value_count), opt3) + expect_identical(select(ref1, -count), opt1 %>% rename(avg = slide_value_value)) + expect_identical(select(ref2, -count), opt2 %>% rename(avg = slide_value_value)) + expect_identical(select(ref3, -count), opt3 %>% rename(avg = slide_value_value)) }) test_that("Both `before` and `after` must be non-NA, non-negative, integer-compatible", { @@ -203,7 +203,7 @@ test_that("Both `before` and `after` must be non-NA, non-negative, integer-compa )) # Results from epi_slide and epi_slide_mean should match - expect_identical(select(ref, -slide_value_count), opt) + expect_identical(select(ref, -count), opt %>% rename(avg = slide_value_value)) }) test_that("`ref_time_values` + `before` + `after` that result in no slide data, generate the error", { @@ -275,8 +275,8 @@ test_that("Warn user against having a blank `before`", { )) # Results from epi_slide and epi_slide_mean should match - expect_identical(select(ref1, -slide_value_count), opt1) - expect_identical(select(ref2, -slide_value_count), opt2) + expect_identical(select(ref1, -count), opt1 %>% rename(avg = slide_value_value)) + expect_identical(select(ref2, -count), opt2 %>% rename(avg = slide_value_value)) }) ## --- These cases doesn't generate the error: --- @@ -289,14 +289,14 @@ test_that( expect_identical( epi_slide(grouped, f, before = 2L, ref_time_values = d + 200L) %>% ungroup() %>% - dplyr::select("geo_value", "slide_value_value"), - dplyr::tibble(geo_value = "ak", slide_value_value = 199) + dplyr::select("geo_value", "avg"), + dplyr::tibble(geo_value = "ak", avg = 199) ) # out of range for one group expect_identical( epi_slide(grouped, f, before = 2L, ref_time_values = d + 3) %>% ungroup() %>% - dplyr::select("geo_value", "slide_value_value"), - dplyr::tibble(geo_value = c("ak", "al"), slide_value_value = c(2, -2)) + dplyr::select("geo_value", "avg"), + dplyr::tibble(geo_value = c("ak", "al"), avg = c(2, -2)) ) # not out of range for either group expect_identical( @@ -314,7 +314,7 @@ test_that( } ) -test_that("computation output formats x as_list_col", { +test_that("can use unnamed list cols as slide computation output", { # See `toy_edf` and `basic_sum_result` definitions at top of file. # We'll try 7d sum with a few formats. expect_identical( @@ -322,15 +322,15 @@ test_that("computation output formats x as_list_col", { basic_sum_result ) expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ sum(.x$value), as_list_col = TRUE), + toy_edf %>% epi_slide(before = 6L, ~ list(sum(.x$value))), basic_sum_result %>% dplyr::mutate(slide_value = as.list(slide_value)) ) expect_identical( toy_edf %>% epi_slide(before = 6L, ~ data.frame(value = sum(.x$value))), - basic_sum_result %>% rename(slide_value_value = slide_value) + basic_sum_result ) expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ data.frame(value = sum(.x$value)), as_list_col = TRUE), + toy_edf %>% epi_slide(before = 6L, ~ data.frame(value = list(sum(.x$value))), as_list_col = TRUE), basic_sum_result %>% mutate(slide_value = purrr::map(slide_value, ~ data.frame(value = .x))) ) From 0f876c377a52ce17128480dfcdc7744c2f9b6988 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Wed, 26 Jun 2024 02:11:27 +0000 Subject: [PATCH 005/110] docs: document (GHA) --- man/epi_slide_mean.Rd | 13 +++++++------ man/epix_slide.Rd | 32 ++++++++++++++++---------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index 8b28b60d..a6a99616 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -12,6 +12,7 @@ epi_slide_mean( after, ref_time_values, time_step, + new_col_name = NULL, all_rows = FALSE, as_list_col = deprecated(), names_sep = deprecated() @@ -69,6 +70,12 @@ return an object of class \link[lubridate:period]{lubridate::period}. For exampl \code{time_step = lubridate::hours} in order to set the time step to be one hour (this would only be meaningful if \code{time_value} is of class \code{POSIXct}).} +\item{new_col_name}{Character vector indicating the name(s) of the new +column(s) that will contain the derivative values. Default +is "slide_value"; note that setting \code{new_col_name} equal to any existing +column names will overwrite those columns. If \code{names_sep} is \code{NULL}, +\code{new_col_name} must be the same length as \code{col_names}.} + \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in the output even with \code{ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s @@ -85,12 +92,6 @@ operations, you might want to replace these \code{NULL} entries with a different \item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix from \code{new_col_name} entirely.} - -\item{new_col_name}{Character vector indicating the name(s) of the new -column(s) that will contain the derivative values. Default -is "slide_value"; note that setting \code{new_col_name} equal to any existing -column names will overwrite those columns. If \code{names_sep} is \code{NULL}, -\code{new_col_name} must be the same length as \code{col_names}.} } \value{ An \code{epi_df} object given by appending one or more new columns to diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index 9e7bda76..a15bb6a2 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -14,9 +14,9 @@ epix_slide( ref_time_values, time_step, new_col_name = "slide_value", - as_list_col = FALSE, - names_sep = "_", - all_versions = FALSE + all_versions = FALSE, + as_list_col = deprecated(), + names_sep = deprecated() ) \method{epix_slide}{epi_archive}( @@ -27,9 +27,9 @@ epix_slide( ref_time_values, time_step, new_col_name = "slide_value", - as_list_col = FALSE, - names_sep = "_", - all_versions = FALSE + all_versions = FALSE, + as_list_col = deprecated(), + names_sep = deprecated() ) \method{epix_slide}{grouped_epi_archive}( @@ -40,9 +40,9 @@ epix_slide( ref_time_values, time_step, new_col_name = NULL, - as_list_col = FALSE, - names_sep = "_", - all_versions = FALSE + all_versions = FALSE, + as_list_col = deprecated(), + names_sep = deprecated() ) } \arguments{ @@ -107,6 +107,13 @@ would only be meaningful if \code{time_value} is of class \code{POSIXct}).} contain the derivative values. Default is "slide_value"; note that setting \code{new_col_name} equal to an existing column name will overwrite this column.} +\item{all_versions}{(Not the same as \code{all_rows} parameter of \code{epi_slide}.) If +\code{all_versions = TRUE}, then \code{f} will be passed the version history (all +\code{version <= ref_time_value}) for rows having \code{time_value} between +\code{ref_time_value - before} and \code{ref_time_value}. Otherwise, \code{f} will be +passed only the most recent \code{version} for every unique \code{time_value}. +Default is \code{FALSE}.} + \item{as_list_col}{Should the slide results be held in a list column, or be \link[tidyr:chop]{unchopped}/\link[tidyr:unnest]{unnested}? Default is \code{FALSE}, in which case a list object returned by \code{f} would be unnested (using @@ -117,13 +124,6 @@ to the names of the list elements.} \item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix from \code{new_col_name} entirely.} - -\item{all_versions}{(Not the same as \code{all_rows} parameter of \code{epi_slide}.) If -\code{all_versions = TRUE}, then \code{f} will be passed the version history (all -\code{version <= ref_time_value}) for rows having \code{time_value} between -\code{ref_time_value - before} and \code{ref_time_value}. Otherwise, \code{f} will be -passed only the most recent \code{version} for every unique \code{time_value}. -Default is \code{FALSE}.} } \value{ A tibble whose columns are: the grouping variables, \code{time_value}, From 7a62004d9a18803069b2e680f50adb87547c8a4e Mon Sep 17 00:00:00 2001 From: brookslogan Date: Wed, 26 Jun 2024 02:11:31 +0000 Subject: [PATCH 006/110] style: styler (GHA) --- R/slide.R | 8 ++++---- R/utils.R | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/R/slide.R b/R/slide.R index 3a7c915a..fe7eea7e 100644 --- a/R/slide.R +++ b/R/slide.R @@ -236,9 +236,9 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, # types. We'll let `list_unchop` deal with checking for type compatibility # between the outputs. if (!rlang::is_quosures(f) && - !all(vapply(slide_values_list, function(x) { - vctrs::obj_is_vector(x) && is.null(vctrs::vec_names(x)) - }, logical(1L))) + !all(vapply(slide_values_list, function(x) { + vctrs::obj_is_vector(x) && is.null(vctrs::vec_names(x)) + }, logical(1L))) ) { cli_abort( "The slide computations must return always atomic vectors @@ -285,7 +285,7 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, .data_group <- filter(.data_group, o) } - result = + result <- if (!is.null(new_col_name)) { # vector or packed data.frame-type column: mutate(.data_group, !!new_col_name := slide_values) diff --git a/R/utils.R b/R/utils.R index bdfc03e4..d4bebd93 100644 --- a/R/utils.R +++ b/R/utils.R @@ -288,10 +288,10 @@ as_slide_computation <- function(f, ...) { nms <- names(quosures) manually_named <- rlang::names2(f) != "" | - vapply(f, function(quosure) { - expression <- rlang::quo_get_expr(quosure) - is.call(expression) && expression[[1L]] == rlang::sym(":=") - }, FUN.VALUE = logical(1L)) + vapply(f, function(quosure) { + expression <- rlang::quo_get_expr(quosure) + is.call(expression) && expression[[1L]] == rlang::sym(":=") + }, FUN.VALUE = logical(1L)) fn <- function(.x, .group_key, .ref_time_value) { x_as_env <- rlang::as_environment(.x) results_env <- new.env(parent = x_as_env) @@ -314,7 +314,7 @@ as_slide_computation <- function(f, ...) { results_names <- results_names[results_names != nm] remove(list = nm, envir = results_env) } else if (vctrs::obj_is_vector(quosure_result_raw) && - is.null(vctrs::vec_names(quosure_result_raw))) { + is.null(vctrs::vec_names(quosure_result_raw))) { # We want something like `dplyr_col_modify()` but allowing recycling # of previous computations and updating `results_env` and unpacking # tibbles if not manually named. From b2e4e61d3f3fb67263ad99640588a2734e21ba06 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 26 Jun 2024 12:51:41 -0700 Subject: [PATCH 007/110] as_slide_computation doesn't take new_col_name in this iteration --- R/grouped_epi_archive.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 50224720..bbbfa001 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -308,7 +308,7 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, cli_abort("If `f` is missing then a computation must be specified via `...`.") } - f <- as_slide_computation(f, new_col_name) + f <- as_slide_computation(f) ... <- missing_arg() # nolint: object_usage_linter. magic value that passes zero args as dots in calls below } From 0a433dca0bf358c8118448cc555436d2972348f1 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 26 Jun 2024 12:51:58 -0700 Subject: [PATCH 008/110] Fix some of the failing epi_slide tests from breaking changes or deprecations --- tests/testthat/test-epi_slide.R | 46 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 30b9a47d..e52f32f8 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -326,14 +326,18 @@ test_that("can use unnamed list cols as slide computation output", { basic_sum_result %>% dplyr::mutate(slide_value = as.list(slide_value)) ) expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ data.frame(value = sum(.x$value))), + toy_edf %>% epi_slide(before = 6L, ~ data.frame(slide_value = sum(.x$value))), basic_sum_result ) expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ data.frame(value = list(sum(.x$value))), as_list_col = TRUE), + toy_edf %>% epi_slide(before = 6L, ~ list(data.frame(value = sum(.x$value)))), basic_sum_result %>% mutate(slide_value = purrr::map(slide_value, ~ data.frame(value = .x))) ) + expect_identical( + toy_edf %>% epi_slide(before = 6L, ~ tibble(slide_value = list(sum(.x$value)))), + basic_sum_result %>% mutate(across(slide_value, as.list)) + ) }) test_that("epi_slide_mean errors when `as_list_col` non-NULL", { @@ -363,7 +367,7 @@ test_that("epi_slide_mean errors when `as_list_col` non-NULL", { value, before = 6L, as_list_col = TRUE, na.rm = TRUE ), - class = "epiprocess__epi_slide_opt__list_not_supported" + class = "lifecycle_error_deprecated" ) # `epi_slide_mean` doesn't return dataframe columns }) @@ -372,22 +376,13 @@ test_that("nested dataframe output names are controllable", { expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), - new_col_name = "result" + before = 6L, ~ data.frame(result = sum(.x$value)) ), - basic_sum_result %>% rename(result_value = slide_value) - ) - expect_identical( - toy_edf %>% - epi_slide( - before = 6L, ~ data.frame(value_sum = sum(.x$value)), - names_sep = NULL - ), - basic_sum_result %>% rename(value_sum = slide_value) + basic_sum_result %>% rename(result = slide_value) ) }) -test_that("non-size-1 outputs are recycled", { +test_that("outputs are recycled", { # trying with non-size-1 computation outputs: # nolint start: line_length_linter. basic_result_from_size2 <- tibble::tribble( @@ -399,22 +394,27 @@ test_that("non-size-1 outputs are recycled", { dplyr::arrange(time_value) %>% as_epi_df(as_of = 100) # nolint end + # + # non-size-1 outputs with appropriate size are no-op "recycled": expect_identical( toy_edf %>% epi_slide(before = 6L, ~ sum(.x$value) + 0:1), basic_result_from_size2 ) expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ sum(.x$value) + 0:1, as_list_col = TRUE), + toy_edf %>% epi_slide(before = 6L, ~ as.list(sum(.x$value) + 0:1)), basic_result_from_size2 %>% dplyr::mutate(slide_value = as.list(slide_value)) ) expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ data.frame(value = sum(.x$value) + 0:1)), - basic_result_from_size2 %>% rename(slide_value_value = slide_value) + toy_edf %>% epi_slide(before = 6L, ~ data.frame(slide_value = sum(.x$value) + 0:1)), + basic_result_from_size2 ) + # size-1 list is recycled: expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ data.frame(value = sum(.x$value) + 0:1), as_list_col = TRUE), + toy_edf %>% epi_slide(before = 6L, ~ list(tibble(value = sum(.x$value) + 0:1))), basic_result_from_size2 %>% - mutate(slide_value = purrr::map(slide_value, ~ data.frame(value = .x))) + group_by(time_value) %>% + mutate(slide_value = rep(list(tibble(value = slide_value)), 2L)) %>% + ungroup() ) }) @@ -472,7 +472,7 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { ) %>% epi_slide_mean( value, - before = 6L, names_sep = NULL, na.rm = TRUE + before = 6L, na.rm = TRUE ), basic_mean_result %>% rename(slide_value_value = slide_value) @@ -484,7 +484,7 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { epi_slide_mean( value, before = 6L, ref_time_values = c(2L, 8L), - names_sep = NULL, na.rm = TRUE + na.rm = TRUE ), filter(basic_mean_result, time_value %in% c(2L, 8L)) %>% rename(slide_value_value = slide_value) @@ -496,7 +496,7 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { epi_slide_mean( value, before = 6L, ref_time_values = c(2L, 8L), all_rows = TRUE, - names_sep = NULL, na.rm = TRUE + na.rm = TRUE ), basic_mean_result %>% dplyr::mutate(slide_value_value = dplyr::if_else(time_value %in% c(2L, 8L), From 3ee20e850bcabe542e80a18490f2c331f388c7b3 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 26 Jun 2024 17:15:13 -0700 Subject: [PATCH 009/110] Update remaining epi_slide tests --- tests/testthat/test-epi_slide.R | 111 ++++++++++++++------------------ 1 file changed, 48 insertions(+), 63 deletions(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index e52f32f8..f6bbeec0 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -330,9 +330,9 @@ test_that("can use unnamed list cols as slide computation output", { basic_sum_result ) expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ list(data.frame(value = sum(.x$value)))), + toy_edf %>% epi_slide(before = 6L, ~ list(data.frame(slide_value = sum(.x$value)))), basic_sum_result %>% - mutate(slide_value = purrr::map(slide_value, ~ data.frame(value = .x))) + mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) ) expect_identical( toy_edf %>% epi_slide(before = 6L, ~ tibble(slide_value = list(sum(.x$value)))), @@ -353,10 +353,7 @@ test_that("epi_slide_mean errors when `as_list_col` non-NULL", { value, before = 6L, na.rm = TRUE ), - basic_mean_result %>% dplyr::mutate( - slide_value_value = slide_value - ) %>% - select(-slide_value) + basic_mean_result %>% rename(slide_value_value = slide_value) ) expect_error( toy_edf %>% @@ -499,64 +496,59 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { na.rm = TRUE ), basic_mean_result %>% - dplyr::mutate(slide_value_value = dplyr::if_else(time_value %in% c(2L, 8L), + dplyr::mutate(slide_value = dplyr::if_else(time_value %in% c(2L, 8L), slide_value, NA_integer_ - )) %>% - select(-slide_value) + )) %>% + rename(slide_value_value = slide_value) ) # slide computations returning data frames: expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ data.frame(value = sum(.x$value))), - basic_full_result %>% dplyr::rename(slide_value_value = slide_value) + toy_edf %>% epi_slide(before = 6L, ~ data.frame(slide_value = sum(.x$value))), + basic_full_result ) expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), + before = 6L, ~ data.frame(slide_value = sum(.x$value)), ref_time_values = c(2L, 8L) ), basic_full_result %>% - dplyr::filter(time_value %in% c(2L, 8L)) %>% - dplyr::rename(slide_value_value = slide_value) + dplyr::filter(time_value %in% c(2L, 8L)) ) expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), + before = 6L, ~ data.frame(slide_value = sum(.x$value)), ref_time_values = c(2L, 8L), all_rows = TRUE ), basic_full_result %>% dplyr::mutate(slide_value = dplyr::if_else(time_value %in% c(2L, 8L), slide_value, NA_integer_ - )) %>% - dplyr::rename(slide_value_value = slide_value) + )) ) # slide computations returning data frames with `as_list_col=TRUE`: expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), - as_list_col = TRUE + before = 6L, ~ list(data.frame(slide_value = sum(.x$value))) ), basic_full_result %>% - dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(value = .x))) + dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) ) expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), - ref_time_values = c(2L, 8L), - as_list_col = TRUE + before = 6L, ~ list(data.frame(slide_value = sum(.x$value))), + ref_time_values = c(2L, 8L) ), basic_full_result %>% - dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(value = .x))) %>% + dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% dplyr::filter(time_value %in% c(2L, 8L)) ) expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), - ref_time_values = c(2L, 8L), all_rows = TRUE, - as_list_col = TRUE + before = 6L, ~ list(data.frame(slide_value = sum(.x$value))), + ref_time_values = c(2L, 8L), all_rows = TRUE ), basic_full_result %>% - dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(value = .x))) %>% + dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% dplyr::mutate(slide_value = dplyr::if_else(time_value %in% c(2L, 8L), slide_value, list(NULL) )) @@ -564,36 +556,31 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { # slide computations returning data frames, `as_list_col = TRUE`, `unnest`: expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), - as_list_col = TRUE + before = 6L, ~ list(data.frame(slide_value = sum(.x$value))) ) %>% - unnest(slide_value, names_sep = "_"), - basic_full_result %>% dplyr::rename(slide_value_value = slide_value) + unnest(slide_value), + basic_full_result ) expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), - ref_time_values = c(2L, 8L), - as_list_col = TRUE + before = 6L, ~ list(data.frame(slide_value = sum(.x$value))), + ref_time_values = c(2L, 8L) ) %>% - unnest(slide_value, names_sep = "_"), + unnest(slide_value), basic_full_result %>% - dplyr::filter(time_value %in% c(2L, 8L)) %>% - dplyr::rename(slide_value_value = slide_value) + dplyr::filter(time_value %in% c(2L, 8L)) ) expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), - ref_time_values = c(2L, 8L), all_rows = TRUE, - as_list_col = TRUE + before = 6L, ~ list(data.frame(slide_value = sum(.x$value))), + ref_time_values = c(2L, 8L), all_rows = TRUE ) %>% - unnest(slide_value, names_sep = "_"), + unnest(slide_value), basic_full_result %>% # XXX unclear exactly what we want in this case. Current approach is # compatible with `vctrs::vec_detect_missing` but breaks `tidyr::unnest` - # compatibility - dplyr::filter(time_value %in% c(2L, 8L)) %>% - dplyr::rename(slide_value_value = slide_value) + # compatibility since the non-ref rows are dropped + dplyr::filter(time_value %in% c(2L, 8L)) ) rework_nulls <- function(slide_values_list) { vctrs::vec_assign( @@ -604,17 +591,15 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { } expect_identical( toy_edf %>% epi_slide( - before = 6L, ~ data.frame(value = sum(.x$value)), - ref_time_values = c(2L, 8L), all_rows = TRUE, - as_list_col = TRUE + before = 6L, ~ list(data.frame(slide_value = sum(.x$value))), + ref_time_values = c(2L, 8L), all_rows = TRUE ) %>% mutate(slide_value = rework_nulls(slide_value)) %>% - unnest(slide_value, names_sep = "_"), + unnest(slide_value), basic_full_result %>% dplyr::mutate(slide_value = dplyr::if_else(time_value %in% c(2L, 8L), slide_value, NA_integer_ - )) %>% - dplyr::rename(slide_value_value = slide_value) + )) ) }) @@ -656,7 +641,7 @@ test_that("basic grouped epi_slide_mean computation produces expected output", { group_by(geo_value) %>% as_epi_df(as_of = d + 6) - result1 <- epi_slide_mean(small_x, value, before = 50, names_sep = NULL, na.rm = TRUE) + result1 <- epi_slide_mean(small_x, value, before = 50, na.rm = TRUE) expect_identical(result1, expected_output %>% rename(slide_value_value = slide_value)) }) @@ -716,7 +701,7 @@ test_that("basic ungrouped epi_slide_mean computation produces expected output", result1 <- small_x %>% ungroup() %>% filter(geo_value == "ak") %>% - epi_slide_mean(value, before = 50, names_sep = NULL, na.rm = TRUE) + epi_slide_mean(value, before = 50, na.rm = TRUE) expect_identical(result1, expected_output %>% rename(slide_value_value = slide_value)) # Ungrouped with multiple geos @@ -922,7 +907,7 @@ test_that("basic slide behavior is correct when groups have non-overlapping date result1 <- epi_slide(small_x_misaligned_dates, f = ~ mean(.x$value), before = 50) expect_identical(result1, expected_output) - result2 <- epi_slide_mean(small_x_misaligned_dates, value, before = 50, names_sep = NULL, na.rm = TRUE) + result2 <- epi_slide_mean(small_x_misaligned_dates, value, before = 50, na.rm = TRUE) expect_identical(result2, expected_output %>% rename(slide_value_value = slide_value)) }) @@ -973,7 +958,7 @@ test_that("results for different `before`s and `after`s match between epi_slide slide_value_a = mean(.x$a, rm.na = TRUE), slide_value_b = mean(.x$b, rm.na = TRUE) ), - before = before, after = after, names_sep = NULL, ... + before = before, after = after, ... ) result2 <- epi_slide_mean(epi_data, col_names = c(a, b), na.rm = TRUE, @@ -1075,7 +1060,7 @@ test_that("results for different time_types match between epi_slide and epi_slid slide_value_a = mean(.x$a, rm.na = TRUE), slide_value_b = mean(.x$b, rm.na = TRUE) ), - before = 6L, after = 0L, names_sep = NULL + before = 6L, after = 0L ) test_time_type_mean <- function(dates, before = 6L, after = 0L, ...) { @@ -1088,7 +1073,7 @@ test_that("results for different time_types match between epi_slide and epi_slid slide_value_a = mean(.x$a, rm.na = TRUE), slide_value_b = mean(.x$b, rm.na = TRUE) ), - before = before, after = after, names_sep = NULL, ... + before = before, after = after, ... ) result2 <- epi_slide_mean(epi_data, col_names = c(a, b), na.rm = TRUE, @@ -1376,31 +1361,31 @@ test_that("`epi_slide_mean` errors when passed `time_values` with closer than ex }) test_that("epi_slide_mean produces same output as epi_slide_opt", { - result1 <- epi_slide_mean(small_x, value, before = 50, names_sep = NULL, na.rm = TRUE) + result1 <- epi_slide_mean(small_x, value, before = 50, na.rm = TRUE) result2 <- epi_slide_opt(small_x, value, f = data.table::frollmean, - before = 50, names_sep = NULL, na.rm = TRUE + before = 50, na.rm = TRUE ) expect_identical(result1, result2) result3 <- epi_slide_opt(small_x, value, f = slider::slide_mean, - before = 50, names_sep = NULL, na_rm = TRUE + before = 50, na_rm = TRUE ) expect_equal(result1, result3) }) test_that("epi_slide_sum produces same output as epi_slide_opt", { - result1 <- epi_slide_sum(small_x, value, before = 50, names_sep = NULL, na.rm = TRUE) + result1 <- epi_slide_sum(small_x, value, before = 50, na.rm = TRUE) result2 <- epi_slide_opt(small_x, value, f = data.table::frollsum, - before = 50, names_sep = NULL, na.rm = TRUE + before = 50, na.rm = TRUE ) expect_identical(result1, result2) result3 <- epi_slide_opt(small_x, value, f = slider::slide_sum, - before = 50, names_sep = NULL, na_rm = TRUE + before = 50, na_rm = TRUE ) expect_equal(result1, result3) }) From d69c5afabafbc6a545d8ad1c9c3780a21ce4cbd2 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Thu, 27 Jun 2024 00:17:33 +0000 Subject: [PATCH 010/110] style: styler (GHA) --- tests/testthat/test-epi_slide.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index f6bbeec0..b025b239 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -498,7 +498,7 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { basic_mean_result %>% dplyr::mutate(slide_value = dplyr::if_else(time_value %in% c(2L, 8L), slide_value, NA_integer_ - )) %>% + )) %>% rename(slide_value_value = slide_value) ) From 02211a4ad4724342a92ad0c9b7f75394a8903dcc Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 1 Jul 2024 15:11:05 -0700 Subject: [PATCH 011/110] Shift to new computation output format scheme in epix_slide() --- R/grouped_epi_archive.R | 54 ++++++++++++++++++++++++++--------------- R/methods-epi_archive.R | 4 +-- R/slide.R | 2 +- R/utils.R | 2 +- man/epix_slide.Rd | 4 +-- 5 files changed, 40 insertions(+), 26 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index bbbfa001..1ea54be3 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -261,6 +261,11 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, if (!missing(time_step)) before <- time_step(before) + checkmate::assert_string(new_col_name, null.ok = TRUE) + if (identical(new_col_name, "time_value")) { + cli_abort('`new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation') + } + # Validate rest of parameters: assert_logical(all_versions, len = 1L) @@ -276,7 +281,7 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, comp_one_grp <- function(.data_group, .group_key, f, ..., ref_time_value, - new_col) { + new_col_name) { # Carry out the specified computation comp_value <- f(.data_group, .group_key, ref_time_value, ...) @@ -287,17 +292,31 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, .var.name = "comp_value (an output of one of your slide computations)" ) - # Label every result row with the `ref_time_value` - res <- list(time_value = ref_time_value) + # Construct result first as list, then tibble-ify, to try to avoid some + # redundant work. `group_modify()` provides the group key, we provide the + # ref time value (appropriately recycled) and comp_value (appropriately + # named / unpacked, for quick feedback) + res <- list(time_value = vctrs::vec_rep(ref_time_value, vctrs::vec_size(comp_value))) + + if (!is.null(new_col_name)) { + # vector or packed data.frame-type column (note: new_col_name of + # "time_value" is disallowed): + res[[new_col_name]] <- comp_value + } else { + if (inherits(comp_value, "data.frame")) { + # unpack into separate columns (without name prefix): + res <- c(res, comp_value) + } else { + # apply default name (to vector or packed data.frame-type column): + res[["slide_value"]] <- comp_value + } + } - # Wrap the computation output in a list and unchop/unnest later if - # `as_list_col = FALSE`. This approach means that we will get a - # list-class col rather than a data.frame-class col when - # `as_list_col = TRUE` and the computations outputs are data - # frames. - res[[new_col]] <- list(comp_value) + # Stop on naming conflicts (names() fine here, non-NULL). Not the + # friendliest error messages though. + vctrs::vec_as_names(names(res), repair = "check_unique") - # Convert the list to a tibble all at once for speed. + # Fast conversion: return(validate_tibble(new_tibble(res))) } @@ -355,7 +374,7 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, group_modify_fn <- function(.data_group, .group_key, f, ..., ref_time_value, - new_col) { + new_col_name) { # .data_group is coming from as_of_df as a tibble, but we # want to feed `comp_one_grp` an `epi_archive` backed by a # DT; convert and wrap: @@ -366,7 +385,7 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, comp_one_grp(.data_group_archive, .group_key, f = f, ..., ref_time_value = ref_time_value, - new_col = new_col + new_col_name = new_col_name ) } } @@ -377,21 +396,16 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, group_modify_fn, f = f, ..., ref_time_value = ref_time_value, - new_col = new_col, + new_col_name = new_col_name, .keep = TRUE ) ) }) - # Combine output into a single tibble - out <- as_tibble(setDF(rbindlist(out))) + # Combine output into a single tibble (allowing for packed columns) + out <- vctrs::vec_rbind(!!!out) # Reconstruct groups out <- group_by(out, !!!syms(x$private$vars), .drop = x$private$drop) - # Unchop/unnest if we need to - if (!as_list_col) { - out <- tidyr::unnest(out, !!new_col, names_sep = names_sep) - } - # nolint start: commented_code_linter. # if (is_epi_df(x)) { # # The analogue of `epi_df`'s `as_of` metadata for an archive is diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index 2d2f6a3d..c3f2d5e0 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -793,7 +793,7 @@ epix_slide <- function( before, ref_time_values, time_step, - new_col_name = "slide_value", + new_col_name = NULL, all_versions = FALSE, as_list_col = deprecated(), names_sep = deprecated()) { UseMethod("epix_slide") @@ -803,7 +803,7 @@ epix_slide <- function( #' @rdname epix_slide #' @export epix_slide.epi_archive <- function(x, f, ..., before, ref_time_values, - time_step, new_col_name = "slide_value", + time_step, new_col_name = NULL, all_versions = FALSE, as_list_col = deprecated(), names_sep = deprecated()) { # For an "ungrouped" slide, treat all rows as belonging to one big diff --git a/R/slide.R b/R/slide.R index fe7eea7e..6d2ad69e 100644 --- a/R/slide.R +++ b/R/slide.R @@ -290,7 +290,7 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, # vector or packed data.frame-type column: mutate(.data_group, !!new_col_name := slide_values) } else { - if (is.data.frame(slide_values)) { + if (inherits(slide_values, "data.frame")) { # unpack into separate columns (without name prefix): mutate(.data_group, slide_values) } else { diff --git a/R/utils.R b/R/utils.R index d4bebd93..f84ef9ee 100644 --- a/R/utils.R +++ b/R/utils.R @@ -331,7 +331,7 @@ as_slide_computation <- function(f, ...) { } } # else `common_size` remains NULL } - if (is.data.frame(quosure_result_recycled) && !manually_named[[i]]) { + if (inherits(quosure_result_recycled, "data.frame") && !manually_named[[i]]) { new_results_names <- names(quosure_result_recycled) results_names <- c(results_names, new_results_names) for (new_result_i in seq_along(quosure_result_recycled)) { diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index a15bb6a2..fd082c70 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -13,7 +13,7 @@ epix_slide( before, ref_time_values, time_step, - new_col_name = "slide_value", + new_col_name = NULL, all_versions = FALSE, as_list_col = deprecated(), names_sep = deprecated() @@ -26,7 +26,7 @@ epix_slide( before, ref_time_values, time_step, - new_col_name = "slide_value", + new_col_name = NULL, all_versions = FALSE, as_list_col = deprecated(), names_sep = deprecated() From 127c1f122ab4251a420959a9ab6c8c1286108cd0 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Mon, 1 Jul 2024 22:16:10 +0000 Subject: [PATCH 012/110] docs: document (GHA) --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index f35681f6..c9a3f589 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -66,7 +66,7 @@ Config/testthat/edition: 3 Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 Depends: R (>= 2.10) URL: https://cmu-delphi.github.io/epiprocess/ From c17b67e3b9712b684216fccbc6aa1d4e1aeaf3a1 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 29 Jul 2024 17:05:10 -0700 Subject: [PATCH 013/110] Fix and update comp_value validation - Correct check for whether data masking was used - Update checks and error messages for currently-accepted kinds of objects - Make some variable naming more consistent between files --- R/grouped_epi_archive.R | 21 ++++++++++++++------- R/slide.R | 25 ++++++++++++++----------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 1ea54be3..9ed6003b 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -285,12 +285,16 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, # Carry out the specified computation comp_value <- f(.data_group, .group_key, ref_time_value, ...) - assert( - check_atomic(comp_value, any.missing = TRUE), - check_data_frame(comp_value), - combine = "or", - .var.name = "comp_value (an output of one of your slide computations)" - ) + # If this wasn't a tidyeval computation, we still need to check the output + # types. We'll let `group_modify` and `vec_rbind` deal with checking for + # type compatibility between the outputs. + if (!used_data_masking && + ! (vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)))) { + cli_abort(" + the slide computations must always return data frames or unnamed (and + not a mix of these two structures). + ") + } # Construct result first as list, then tibble-ify, to try to avoid some # redundant work. `group_modify()` provides the group key, we provide the @@ -322,13 +326,16 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, # If `f` is missing, interpret ... as an expression for tidy evaluation if (missing(f)) { + used_data_masking <- TRUE quosures <- enquos(...) if (length(quosures) == 0) { cli_abort("If `f` is missing then a computation must be specified via `...`.") } - f <- as_slide_computation(f) + f <- as_slide_computation(quosures) ... <- missing_arg() # nolint: object_usage_linter. magic value that passes zero args as dots in calls below + } else { + used_data_masking <- FALSE } f <- as_slide_computation(f, ...) diff --git a/R/slide.R b/R/slide.R index 6d2ad69e..976b9602 100644 --- a/R/slide.R +++ b/R/slide.R @@ -235,15 +235,15 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, # If this wasn't a tidyeval computation, we still need to check the output # types. We'll let `list_unchop` deal with checking for type compatibility # between the outputs. - if (!rlang::is_quosures(f) && - !all(vapply(slide_values_list, function(x) { - vctrs::obj_is_vector(x) && is.null(vctrs::vec_names(x)) + if (!used_data_masking && + !all(vapply(slide_values_list, function(comp_value) { + vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)) }, logical(1L))) ) { - cli_abort( - "The slide computations must return always atomic vectors - or data frames (and not a mix of these two structures)." - ) + cli_abort(" + the slide computations must always return data frames or unnamed (and + not a mix of these two structures). + ") } # Now figure out which rows in the data group are in the reference time @@ -304,16 +304,19 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, # If `f` is missing, interpret ... as an expression for tidy evaluation if (missing(f)) { - quos <- enquos(...) - if (length(quos) == 0) { + used_data_masking <- TRUE + quosures <- enquos(...) + if (length(quosures) == 0) { cli_abort("If `f` is missing then a computation must be specified via `...`.") } - if (length(quos) > 1) { + if (length(quosures) > 1) { cli_abort("If `f` is missing then only a single computation can be specified via `...`.") } - f <- quos + f <- quosures ... <- missing_arg() # magic value that passes zero args as dots in calls below # nolint: object_usage_linter + } else { + used_data_masking <- FALSE } f <- as_slide_computation(f, ...) From 0fa282a3cef8371ad50eaad147f60a098267c775 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Tue, 30 Jul 2024 00:09:14 +0000 Subject: [PATCH 014/110] style: styler (GHA) --- R/grouped_epi_archive.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 9ed6003b..49a4da59 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -289,7 +289,7 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, # types. We'll let `group_modify` and `vec_rbind` deal with checking for # type compatibility between the outputs. if (!used_data_masking && - ! (vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)))) { + !(vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)))) { cli_abort(" the slide computations must always return data frames or unnamed (and not a mix of these two structures). From b128abb619ad663b67f8538a7c21c0ee73f3f25a Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 29 Jul 2024 17:21:53 -0700 Subject: [PATCH 015/110] Fix `as_tibble` on grouped `epi_df`s w/ current `tsibble` version --- R/methods-epi_df.R | 10 +++++----- man/as_tibble.epi_df.Rd | 2 +- tests/testthat/test-methods-epi_df.R | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index 526a1171..a397a33f 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -4,15 +4,15 @@ #' grouping. #' #' @template x -#' @param ... additional arguments to forward to `NextMethod()` +#' @param ... forwarded to `as_tibble` for `data.frame`s #' #' @importFrom tibble as_tibble #' @export as_tibble.epi_df <- function(x, ...) { - # Decaying drops the class and metadata. `as_tibble.grouped_df` drops the - # grouping and should be called by `NextMethod()` in the current design. - # See #223 for discussion of alternatives. - decay_epi_df(NextMethod()) + # Note that some versions of `tsibble` overwrite `as_tibble.grouped_df`, which + # also impacts grouped `epi_df`s don't rely on `NextMethod()`. Destructure + # first instead. + tibble::as_tibble(vctrs::vec_data(x), ...) } #' Convert to tsibble format diff --git a/man/as_tibble.epi_df.Rd b/man/as_tibble.epi_df.Rd index 5913a5e7..5db66369 100644 --- a/man/as_tibble.epi_df.Rd +++ b/man/as_tibble.epi_df.Rd @@ -9,7 +9,7 @@ \arguments{ \item{x}{an \code{epi_df}} -\item{...}{additional arguments to forward to \code{NextMethod()}} +\item{...}{forwarded to \code{as_tibble} for \code{data.frame}s} } \description{ Converts an \code{epi_df} object into a tibble, dropping metadata and any diff --git a/tests/testthat/test-methods-epi_df.R b/tests/testthat/test-methods-epi_df.R index b071d3ec..3699f389 100644 --- a/tests/testthat/test-methods-epi_df.R +++ b/tests/testthat/test-methods-epi_df.R @@ -128,6 +128,7 @@ test_that("Metadata and grouping are dropped by `as_tibble`", { expect_true( !any(c("metadata", "groups") %in% names(attributes(grouped_converted))) ) + expect_s3_class(grouped_converted, class(tibble()), exact = TRUE) }) test_that("Renaming columns gives appropriate colnames and metadata", { From 8d7ea7d315ef11c3967af132578dc2fffc8d2756 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 29 Jul 2024 18:08:56 -0700 Subject: [PATCH 016/110] Fix tidyeval unnamed tibble names access errors --- R/utils.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/utils.R b/R/utils.R index f84ef9ee..41fdc978 100644 --- a/R/utils.R +++ b/R/utils.R @@ -331,11 +331,11 @@ as_slide_computation <- function(f, ...) { } } # else `common_size` remains NULL } - if (inherits(quosure_result_recycled, "data.frame") && !manually_named[[i]]) { + if (inherits(quosure_result_recycled, "data.frame") && !manually_named[[quosure_i]]) { new_results_names <- names(quosure_result_recycled) results_names <- c(results_names, new_results_names) for (new_result_i in seq_along(quosure_result_recycled)) { - results_env[[new_result_i]] <- quosure_result_recycled[[new_result_i]] + results_env[[new_results_names[[new_result_i]]]] <- quosure_result_recycled[[new_result_i]] } } else { nm <- nms[[quosure_i]] From c66ef547e3b5cd306865d9c60c18f321bdfa4c2e Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 29 Jul 2024 18:09:42 -0700 Subject: [PATCH 017/110] Update archive slide tests using deprecated features --- tests/testthat/test-epix_slide.R | 66 ++++++++------------------------ 1 file changed, 17 insertions(+), 49 deletions(-) diff --git a/tests/testthat/test-epix_slide.R b/tests/testthat/test-epix_slide.R index a5b72cbf..2f271242 100644 --- a/tests/testthat/test-epix_slide.R +++ b/tests/testthat/test-epix_slide.R @@ -54,7 +54,7 @@ test_that("epix_slide works as intended", { group_by(.data$geo_value) %>% epix_slide(f = function(x, gk, rtv) { tibble::tibble(sum_binary = sum(x$binary)) - }, before = 2, names_sep = NULL) + }, before = 2) expect_identical(xx1, xx4) @@ -69,13 +69,12 @@ test_that("epix_slide works as intended", { expect_identical(xx1, xx5) }) -test_that("epix_slide works as intended with `as_list_col=TRUE`", { +test_that("epix_slide works as intended with list cols", { xx_dfrow1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ data.frame(bin_sum = sum(.x$binary)), - before = 2, - as_list_col = TRUE + f = ~ list(data.frame(bin_sum = sum(.x$binary))), + before = 2 ) xx_dfrow2 <- tibble( @@ -96,9 +95,8 @@ test_that("epix_slide works as intended with `as_list_col=TRUE`", { xx_dfrow3 <- xx %>% group_by(dplyr::across(dplyr::all_of("geo_value"))) %>% epix_slide( - f = ~ data.frame(bin_sum = sum(.x$binary)), - before = 2, - as_list_col = TRUE + f = ~ list(data.frame(bin_sum = sum(.x$binary))), + before = 2 ) expect_identical(xx_dfrow1, xx_dfrow3) # This and * Imply xx_dfrow2 and xx_dfrow3 are identical @@ -106,9 +104,8 @@ test_that("epix_slide works as intended with `as_list_col=TRUE`", { xx_df1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ data.frame(bin = .x$binary), - before = 2, - as_list_col = TRUE + f = ~ list(data.frame(bin = .x$binary)), + before = 2 ) xx_df2 <- tibble( @@ -129,9 +126,8 @@ test_that("epix_slide works as intended with `as_list_col=TRUE`", { xx_scalar1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ sum(.x$binary), - before = 2, - as_list_col = TRUE + f = ~ list(sum(.x$binary)), + before = 2 ) xx_scalar2 <- tibble( @@ -152,9 +148,8 @@ test_that("epix_slide works as intended with `as_list_col=TRUE`", { xx_vec1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ .x$binary, - before = 2, - as_list_col = TRUE + f = ~ list(.x$binary), + before = 2 ) xx_vec2 <- tibble( @@ -377,7 +372,6 @@ test_that("epix_slide with all_versions option has access to all older versions" epix_slide( f = slide_fn, before = 10^3, - names_sep = NULL, all_versions = TRUE ) @@ -400,7 +394,6 @@ test_that("epix_slide with all_versions option has access to all older versions" epix_slide( f = slide_fn, before = 10^3, - names_sep = NULL, all_versions = TRUE ) @@ -412,7 +405,6 @@ test_that("epix_slide with all_versions option has access to all older versions" epix_slide( f = ~ slide_fn(.x, .y), before = 10^3, - names_sep = NULL, all_versions = TRUE ) @@ -422,12 +414,8 @@ test_that("epix_slide with all_versions option has access to all older versions" result5 <- ea %>% group_by() %>% epix_slide( - data = slide_fn( - .x, - stop("slide_fn doesn't use group key, no need to prepare it") - ), + , slide_fn(.x, .group_key, .ref_time_value), before = 10^3, - names_sep = NULL, all_versions = TRUE ) @@ -447,7 +435,7 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { expect_identical( ea %>% epix_as_of(ref_time_value1) %>% f1() %>% mutate(time_value = ref_time_value1, .before = 1L), - ea %>% epix_slide(f1, before = 1000L, ref_time_values = ref_time_value1, names_sep = NULL) + ea %>% epix_slide(f1, before = 1000L, ref_time_values = ref_time_value1) ) # For all_versions = TRUE: @@ -463,7 +451,7 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { rename(real_time_value = time_value, lag1 = binary) )) }, - before = 1, names_sep = NULL + before = 1 ) %>% # assess as nowcast: unnest(data) %>% @@ -480,7 +468,7 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { epix_as_of(ref_time_value2, all_versions = TRUE) %>% f2() %>% mutate(time_value = ref_time_value2, .before = 1L), - ea %>% epix_slide(f2, before = 1000L, ref_time_values = ref_time_value2, all_versions = TRUE, names_sep = NULL) + ea %>% epix_slide(f2, before = 1000L, ref_time_values = ref_time_value2, all_versions = TRUE) ) # Test the same sort of thing when grouping by geo in an archive with multiple geos. @@ -494,7 +482,7 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { expect_identical( ea_multigeo %>% group_by(geo_value) %>% - epix_slide(f2, before = 1000L, ref_time_values = ref_time_value2, all_versions = TRUE, names_sep = NULL) %>% + epix_slide(f2, before = 1000L, ref_time_values = ref_time_value2, all_versions = TRUE) %>% filter(geo_value == "x"), ea %>% # using `ea` here is like filtering `ea_multigeo` to `geo_value=="x"` epix_as_of(ref_time_value2, all_versions = TRUE) %>% @@ -626,26 +614,6 @@ test_that("epix_slide works with 0-row computation outputs", { ) }) -# nolint start: commented_code_linter. -# test_that("epix_slide grouped by geo can produce `epi_df` output", { -# # This is a characterization test. Not sure we actually want this behavior; -# # https://github.com/cmu-delphi/epiprocess/pull/290#issuecomment-1489099157 -# expect_identical( -# ea %>% -# group_by(geo_value) %>% -# epix_slide(before = 5L, function(x,g) { -# tibble::tibble(value = 42) -# }, names_sep = NULL), -# tibble::tibble( -# geo_value = "x", -# time_value = epix_slide_ref_time_values_default(ea), -# value = 42 -# ) %>% -# new_epi_df(as_of = ea$versions_end) -# ) -# }) -# nolint end - test_that("epix_slide alerts if the provided f doesn't take enough args", { f_xgt <- function(x, g, t) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) # If `regexp` is NA, asserts that there should be no errors/messages. From 30a2166516fb91154dd3e475995b2d264dfc136a Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 29 Jul 2024 19:31:40 -0700 Subject: [PATCH 018/110] Actually allow multiple quosures to be passed into `epi_slide` --- R/slide.R | 3 --- 1 file changed, 3 deletions(-) diff --git a/R/slide.R b/R/slide.R index 976b9602..d020e182 100644 --- a/R/slide.R +++ b/R/slide.R @@ -309,9 +309,6 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, if (length(quosures) == 0) { cli_abort("If `f` is missing then a computation must be specified via `...`.") } - if (length(quosures) > 1) { - cli_abort("If `f` is missing then only a single computation can be specified via `...`.") - } f <- quosures ... <- missing_arg() # magic value that passes zero args as dots in calls below # nolint: object_usage_linter From e9b1b1bb26ca2b814db48d3f98fe1e51667163d5 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 29 Jul 2024 19:35:44 -0700 Subject: [PATCH 019/110] Update `epi_slide` tests with expanded data-masking support --- tests/testthat/test-epi_slide.R | 70 +++++++++++++++++++++++++++++++- tests/testthat/test-epix_slide.R | 4 +- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index b025b239..b83b715e 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -314,7 +314,7 @@ test_that( } ) -test_that("can use unnamed list cols as slide computation output", { +test_that("epi_slide outputs list columns when desired, and unpacks unnamed computations", { # See `toy_edf` and `basic_sum_result` definitions at top of file. # We'll try 7d sum with a few formats. expect_identical( @@ -325,6 +325,10 @@ test_that("can use unnamed list cols as slide computation output", { toy_edf %>% epi_slide(before = 6L, ~ list(sum(.x$value))), basic_sum_result %>% dplyr::mutate(slide_value = as.list(slide_value)) ) + expect_identical( + toy_edf %>% epi_slide(before = 6L, ~ list(rep(sum(.x$value), 2L))), + basic_sum_result %>% dplyr::mutate(slide_value = lapply(slide_value, rep, 2L)) + ) expect_identical( toy_edf %>% epi_slide(before = 6L, ~ data.frame(slide_value = sum(.x$value))), basic_sum_result @@ -338,6 +342,70 @@ test_that("can use unnamed list cols as slide computation output", { toy_edf %>% epi_slide(before = 6L, ~ tibble(slide_value = list(sum(.x$value)))), basic_sum_result %>% mutate(across(slide_value, as.list)) ) + # unnamed data-masking expression producing data frame: + expect_identical( + # unfortunately, we can't pass this directly as `f` and need an extra comma + toy_edf %>% epi_slide(before = 6L, , data.frame(slide_value = sum(.x$value))), + basic_sum_result + ) +}) + +test_that("epi_slide can use sequential data masking expressions including NULL", { + edf <- tibble::tibble( + geo_value = 1, + time_value = 1:10, + value = 1:10 + ) %>% + as_epi_df(as_of = 12L) + + noisiness1 <- edf %>% + group_by(geo_value) %>% + epi_slide( + before = 1L, after = 2L, + valid = length(.x$value) == 4L, + pred = mean(.x$value[1:2]), + noisiness = sqrt(sum((.x$value[3:4] - pred)^2)), + pred = NULL + ) %>% + ungroup() %>% + filter(valid) %>% + select(-valid) + + noisiness0 <- edf %>% + filter( + time_value >= min(time_value) + 1L, + time_value <= max(time_value) - 2L + ) %>% + mutate(noisiness = sqrt((3 - 1.5)^2 + (4 - 1.5)^2)) + + expect_identical(noisiness1, noisiness0) +}) + +test_that("epi_slide can use {nm} :=", { + nm <- "slide_value" + expect_identical( + # unfortunately, we can't pass this directly as `f` and need an extra comma + toy_edf %>% epi_slide(before = 6L, , !!nm := sum(value)), + basic_sum_result + ) +}) + +test_that("epi_slide can produce packed outputs", { + packed_basic_result <- basic_sum_result %>% + tidyr::pack(container = c(slide_value)) %>% + dplyr_reconstruct(basic_sum_result) + expect_identical( + toy_edf %>% epi_slide(before = 6L, ~ tibble::tibble(slide_value = sum(.x$value)), new_col_name = "container"), + packed_basic_result + ) + expect_identical( + toy_edf %>% epi_slide(before = 6L, container = tibble::tibble(slide_value = sum(.x$value))), + packed_basic_result + ) + expect_identical( + toy_edf %>% epi_slide(before = 6L, , tibble::tibble(slide_value = sum(.x$value)), new_col_name = "container"), + packed_basic_result + ) }) test_that("epi_slide_mean errors when `as_list_col` non-NULL", { diff --git a/tests/testthat/test-epix_slide.R b/tests/testthat/test-epix_slide.R index 2f271242..9c890043 100644 --- a/tests/testthat/test-epix_slide.R +++ b/tests/testthat/test-epix_slide.R @@ -414,7 +414,9 @@ test_that("epix_slide with all_versions option has access to all older versions" result5 <- ea %>% group_by() %>% epix_slide( - , slide_fn(.x, .group_key, .ref_time_value), + # unfortunately, we can't pass this directly as `f` and need an extra comma + , + slide_fn(.x, .group_key, .ref_time_value), before = 10^3, all_versions = TRUE ) From 9b73649494bbfe57350949782852803688d19c4d Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 29 Jul 2024 22:00:12 -0700 Subject: [PATCH 020/110] Avoid warning in slides on `binding = NULL` if binding doesn't exist to match `mutate` behavior --- R/utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index 41fdc978..ff5f3b56 100644 --- a/R/utils.R +++ b/R/utils.R @@ -312,7 +312,7 @@ as_slide_computation <- function(f, ...) { if (is.null(quosure_result_raw)) { nm <- nms[[quosure_i]] results_names <- results_names[results_names != nm] - remove(list = nm, envir = results_env) + rlang::env_unbind(results_env, nm) } else if (vctrs::obj_is_vector(quosure_result_raw) && is.null(vctrs::vec_names(quosure_result_raw))) { # We want something like `dplyr_col_modify()` but allowing recycling From a1c7020cc1d840fdaa6017f78c5beabae5a17171 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 29 Jul 2024 22:17:50 -0700 Subject: [PATCH 021/110] Make advanced slide tidyeval tests realistically work around recycling --- tests/testthat/test-epi_slide.R | 47 +++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index b83b715e..c210f724 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -351,34 +351,65 @@ test_that("epi_slide outputs list columns when desired, and unpacks unnamed comp }) test_that("epi_slide can use sequential data masking expressions including NULL", { - edf <- tibble::tibble( + edf_A <- tibble::tibble( geo_value = 1, time_value = 1:10, value = 1:10 ) %>% as_epi_df(as_of = 12L) - noisiness1 <- edf %>% + noisiness_A1 <- edf_A %>% group_by(geo_value) %>% epi_slide( before = 1L, after = 2L, - valid = length(.x$value) == 4L, - pred = mean(.x$value[1:2]), - noisiness = sqrt(sum((.x$value[3:4] - pred)^2)), + valid = nrow(.x) == 4L, # not the best approach... + m = mean(.x$value[1:2]), + noisiness = sqrt(mean((value[3:4] - m)^2)), + m = NULL + ) %>% + ungroup() %>% + filter(valid) %>% + select(-valid) + + noisiness_A0 <- edf_A %>% + filter( + time_value >= min(time_value) + 1L, + time_value <= max(time_value) - 2L + ) %>% + mutate(noisiness = sqrt((3 - 1.5)^2 + (4 - 1.5)^2) / sqrt(2)) + + expect_identical(noisiness_A1, noisiness_A0) + + edf_B <- tibble::tibble( + geo_value = 1, + time_value = 1:10, + value = rep(1:2, 5L) + ) %>% + as_epi_df(as_of = 12L) + + noisiness_B1 <- edf_B %>% + group_by(geo_value) %>% + epi_slide( + before = 1L, after = 2L, + valid = nrow(.x) == 4L, # not the best approach... + model = list(lm(value ~ time_value, .x[1:2, ])), + pred = list(predict(model[[1L]], newdata = .x[3:4, "time_value"])), + model = NULL, + noisiness = sqrt(mean((.data$value[3:4] - .data$pred[[1L]])^2)), pred = NULL ) %>% ungroup() %>% filter(valid) %>% select(-valid) - noisiness0 <- edf %>% + noisiness_B0 <- edf_B %>% filter( time_value >= min(time_value) + 1L, time_value <= max(time_value) - 2L ) %>% - mutate(noisiness = sqrt((3 - 1.5)^2 + (4 - 1.5)^2)) + mutate(noisiness = sqrt((1 - 3)^2 + (2 - 4)^2) / sqrt(2)) - expect_identical(noisiness1, noisiness0) + expect_equal(noisiness_B1, noisiness_B0) }) test_that("epi_slide can use {nm} :=", { From ec77184eb641b66102983165d11741c0e6298d0d Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Tue, 30 Jul 2024 15:10:24 -0700 Subject: [PATCH 022/110] Test that epi_slide balks at bad computation outputs --- R/grouped_epi_archive.R | 7 ++++--- R/slide.R | 7 ++++--- R/utils.R | 7 ++++++- tests/testthat/test-epi_slide.R | 19 +++++++++++++++++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 49a4da59..b3bf0d88 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -291,9 +291,10 @@ epix_slide.grouped_epi_archive <- function(x, f, ..., before, ref_time_values, if (!used_data_masking && !(vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)))) { cli_abort(" - the slide computations must always return data frames or unnamed (and - not a mix of these two structures). - ") + the slide computations must always return data frames or unnamed vectors + (as determined by the vctrs package) (and not a mix of these two + structures). + ", class = "epiprocess__invalid_slide_comp_value") } # Construct result first as list, then tibble-ify, to try to avoid some diff --git a/R/slide.R b/R/slide.R index d020e182..a9fb13b8 100644 --- a/R/slide.R +++ b/R/slide.R @@ -241,9 +241,10 @@ epi_slide <- function(x, f, ..., before, after, ref_time_values, }, logical(1L))) ) { cli_abort(" - the slide computations must always return data frames or unnamed (and - not a mix of these two structures). - ") + the slide computations must always return data frames or unnamed vectors + (as determined by the vctrs package) (and not a mix of these two + structures). + ", class = "epiprocess__invalid_slide_comp_value") } # Now figure out which rows in the data group are in the reference time diff --git a/R/utils.R b/R/utils.R index ff5f3b56..c18b4df4 100644 --- a/R/utils.R +++ b/R/utils.R @@ -343,7 +343,12 @@ as_slide_computation <- function(f, ...) { results_env[[nm]] <- quosure_result_recycled } } else { - cli_abort("Problem with output of {.code {rlang::expr_deparse(rlang::quo_get_expr(f[[quosure_i]]))}}; it produced a result that was neither NULL, a data.frame, nor a vector without unnamed entries (as determined by the vctrs package).") + cli_abort(" + Problem with output of {.code + {rlang::expr_deparse(rlang::quo_get_expr(f[[quosure_i]]))}}; it + produced a result that was neither NULL, a data.frame, nor a vector + without unnamed entries (as determined by the vctrs package). + ", class = "epiprocess__invalid_slide_comp_tidyeval_output") } } validate_tibble(new_tibble(as.list(results_env)[results_names])) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index c210f724..b453de60 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -412,6 +412,25 @@ test_that("epi_slide can use sequential data masking expressions including NULL" expect_equal(noisiness_B1, noisiness_B0) }) +test_that("epi_slide complains on invalid computation outputs", { + expect_error( + toy_edf %>% epi_slide(before = 6L, ~ lm(value ~ time_value, .x)), + class = "epiprocess__invalid_slide_comp_value" + ) + expect_no_error( + toy_edf %>% epi_slide(before = 6L, ~ list(lm(value ~ time_value, .x))), + class = "epiprocess__invalid_slide_comp_value" + ) + expect_error( + toy_edf %>% epi_slide(before = 6L, model = lm(value ~ time_value, .x)), + class = "epiprocess__invalid_slide_comp_tidyeval_output" + ) + expect_no_error( + toy_edf %>% epi_slide(before = 6L, model = list(lm(value ~ time_value, .x))), + class = "epiprocess__invalid_slide_comp_tidyeval_output" + ) +}) + test_that("epi_slide can use {nm} :=", { nm <- "slide_value" expect_identical( From e089d4231cfb393cceb6c58d70d1c9d810e8dc1a Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Tue, 30 Jul 2024 18:55:26 -0700 Subject: [PATCH 023/110] Document new slide tidyeval features --- R/methods-epi_archive.R | 11 ++++---- R/slide.R | 9 +++--- man-roxygen/basic-slide-details.R | 33 +++++++++++++++++----- man/epi_slide.Rd | 46 +++++++++++++++++++++++-------- man/epix_slide.Rd | 11 ++++---- 5 files changed, 78 insertions(+), 32 deletions(-) diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index f8020469..852fc06a 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -579,11 +579,12 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' `.z` or `.ref_time_value`. If `f` is missing, then `...` will specify the #' computation. #' @param ... Additional arguments to pass to the function or formula specified -#' via `f`. Alternatively, if `f` is missing, then `...` is interpreted as an -#' expression for tidy evaluation; in addition to referring to columns -#' directly by name, the expression has access to `.data` and `.env` pronouns -#' as in `dplyr` verbs, and can also refer to the `.group_key` and -#' `.ref_time_value`. See details of [`epi_slide`]. +#' via `f`. Alternatively, if `f` is missing, then the `...` is interpreted as +#' a ["data-masking"][rlang::args_data_masking] expression or expressions for +#' tidy evaluation; in addition to referring columns directly by name, the +#' expressions have access to `.data` and `.env` pronouns as in `dplyr` verbs, +#' and can also refer to `.x`, `.group_key`, and `.ref_time_value`. See +#' details. #' @param before How far `before` each `ref_time_value` should the sliding #' window extend? If provided, should be a single, non-NA, #' [integer-compatible][vctrs::vec_cast] number of time steps. This window diff --git a/R/slide.R b/R/slide.R index dff9c75f..3ba46a81 100644 --- a/R/slide.R +++ b/R/slide.R @@ -21,10 +21,11 @@ #' If `f` is missing, then `...` will specify the computation. #' @param ... Additional arguments to pass to the function or formula specified #' via `f`. Alternatively, if `f` is missing, then the `...` is interpreted as -#' an expression for tidy evaluation; in addition to referring to columns -#' directly by name, the expression has access to `.data` and `.env` pronouns -#' as in `dplyr` verbs, and can also refer to `.x`, `.group_key`, and -#' `.ref_time_value`. See details. +#' a ["data-masking"][rlang::args_data_masking] expression or expressions for +#' tidy evaluation; in addition to referring columns directly by name, the +#' expressions have access to `.data` and `.env` pronouns as in `dplyr` verbs, +#' and can also refer to `.x`, `.group_key`, and `.ref_time_value`. See +#' details. #' @param new_col_name String indicating the name of the new column that will #' contain the derivative values. Default is "slide_value"; note that setting #' `new_col_name` equal to an existing column name will overwrite this column. diff --git a/man-roxygen/basic-slide-details.R b/man-roxygen/basic-slide-details.R index f8f6792d..a82ca541 100644 --- a/man-roxygen/basic-slide-details.R +++ b/man-roxygen/basic-slide-details.R @@ -18,17 +18,36 @@ #' zero-width windows are considered, manually pass both the `before` and #' `after` arguments. #' -#' If `f` is missing, then an expression for tidy evaluation can be specified, -#' for example, as in: +#' If `f` is missing, then ["data-masking"][rlang::args_data_masking] +#' expression(s) for tidy evaluation can be specified, for example, as in: #' ``` #' epi_slide(x, cases_7dav = mean(cases), before = 6) #' ``` #' which would be equivalent to: #' ``` -#' epi_slide(x, function(x, g) mean(x$cases), before = 6, +#' epi_slide(x, function(x, g, t) mean(x$cases), before = 6, #' new_col_name = "cases_7dav") #' ``` -#' Thus, to be clear, when the computation is specified via an expression for -#' tidy evaluation (first example, above), then the name for the new column is -#' inferred from the given expression and overrides any name passed explicitly -#' through the `new_col_name` argument. +#' In a manner similar to [`dplyr::mutate`]: +#' * Expressions evaluating to length-1 vectors will be recycled to +#' appropriate lengths. +#' * `= NULL` can be used to remove results from previous expressions (though +#' we don't allow it to remove pre-existing columns). +#' * Unnamed expressions evaluating to data frames will be unpacked into +#' multiple columns in the result; to use this feature, you will need to add +#' an extra comma before your first data-masking expression to make sure `f` +#' appears as missing. +#' * Named expressions evaluating to data frames will be placed into +#' [`tidyr::pack`]ed columns. +#' +#' In addition to [`.data`] and [`.env`], we make some additional +#' "pronoun"-like bindings available: +#' * .x, which is like `.x` in [`dplyr::group_modify`]; an ordinary object +#' like an `epi_df` rather than an rlang [pronoun][rlang::as_data_pronoun] +#' like [`.data`]; this allows you to use additional {dplyr}, {tidyr}, and +#' {epiprocess} operations. If you have multiple expressions in `...`, this +#' won't let you refer to the output of the earlier expressions, but `.data` +#' will. +#' * .group_key, which is like `.y` in [`dplyr::group_modify`]. +#' * .ref_time_value, which is the element of `ref_time_values` that +#' determined the time window for the current computation. diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index cd801b97..98dd30a0 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -39,10 +39,11 @@ If \code{f} is missing, then \code{...} will specify the computation.} \item{...}{Additional arguments to pass to the function or formula specified via \code{f}. Alternatively, if \code{f} is missing, then the \code{...} is interpreted as -an expression for tidy evaluation; in addition to referring to columns -directly by name, the expression has access to \code{.data} and \code{.env} pronouns -as in \code{dplyr} verbs, and can also refer to \code{.x}, \code{.group_key}, and -\code{.ref_time_value}. See details.} +a \link[rlang:args_data_masking]{"data-masking"} expression or expressions for +tidy evaluation; in addition to referring columns directly by name, the +expressions have access to \code{.data} and \code{.env} pronouns as in \code{dplyr} verbs, +and can also refer to \code{.x}, \code{.group_key}, and \code{.ref_time_value}. See +details.} \item{before, after}{How far \code{before} and \code{after} each \code{ref_time_value} should the sliding window extend? At least one of these two arguments must be @@ -130,22 +131,45 @@ widths and compare the slide outputs. In the (uncommon) case where zero-width windows are considered, manually pass both the \code{before} and \code{after} arguments. -If \code{f} is missing, then an expression for tidy evaluation can be specified, -for example, as in: +If \code{f} is missing, then \link[rlang:args_data_masking]{"data-masking"} +expression(s) for tidy evaluation can be specified, for example, as in: \if{html}{\out{
}}\preformatted{epi_slide(x, cases_7dav = mean(cases), before = 6) }\if{html}{\out{
}} which would be equivalent to: -\if{html}{\out{
}}\preformatted{epi_slide(x, function(x, g) mean(x$cases), before = 6, +\if{html}{\out{
}}\preformatted{epi_slide(x, function(x, g, t) mean(x$cases), before = 6, new_col_name = "cases_7dav") }\if{html}{\out{
}} -Thus, to be clear, when the computation is specified via an expression for -tidy evaluation (first example, above), then the name for the new column is -inferred from the given expression and overrides any name passed explicitly -through the \code{new_col_name} argument. +In a manner similar to \code{\link[dplyr:mutate]{dplyr::mutate}}: +\itemize{ +\item Expressions evaluating to length-1 vectors will be recycled to +appropriate lengths. +\item \verb{= NULL} can be used to remove results from previous expressions (though +we don't allow it to remove pre-existing columns). +\item Unnamed expressions evaluating to data frames will be unpacked into +multiple columns in the result; to use this feature, you will need to add +an extra comma before your first data-masking expression to make sure \code{f} +appears as missing. +\item Named expressions evaluating to data frames will be placed into +\code{\link[tidyr:pack]{tidyr::pack}}ed columns. +} + +In addition to \code{\link{.data}} and \code{\link{.env}}, we make some additional +"pronoun"-like bindings available: +\itemize{ +\item .x, which is like \code{.x} in \code{\link[dplyr:group_map]{dplyr::group_modify}}; an ordinary object +like an \code{epi_df} rather than an rlang \link[rlang:as_data_mask]{pronoun} +like \code{\link{.data}}; this allows you to use additional {dplyr}, {tidyr}, and +{epiprocess} operations. If you have multiple expressions in \code{...}, this +won't let you refer to the output of the earlier expressions, but \code{.data} +will. +\item .group_key, which is like \code{.y} in \code{\link[dplyr:group_map]{dplyr::group_modify}}. +\item .ref_time_value, which is the element of \code{ref_time_values} that +determined the time window for the current computation. +} } \examples{ # slide a 7-day trailing average formula on cases diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index de794aa8..2eb40b1c 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -64,11 +64,12 @@ group-\code{ref_time_value} combination. The group key can be accessed via computation.} \item{...}{Additional arguments to pass to the function or formula specified -via \code{f}. Alternatively, if \code{f} is missing, then \code{...} is interpreted as an -expression for tidy evaluation; in addition to referring to columns -directly by name, the expression has access to \code{.data} and \code{.env} pronouns -as in \code{dplyr} verbs, and can also refer to the \code{.group_key} and -\code{.ref_time_value}. See details of \code{\link{epi_slide}}.} +via \code{f}. Alternatively, if \code{f} is missing, then the \code{...} is interpreted as +a \link[rlang:args_data_masking]{"data-masking"} expression or expressions for +tidy evaluation; in addition to referring columns directly by name, the +expressions have access to \code{.data} and \code{.env} pronouns as in \code{dplyr} verbs, +and can also refer to \code{.x}, \code{.group_key}, and \code{.ref_time_value}. See +details.} \item{before}{How far \code{before} each \code{ref_time_value} should the sliding window extend? If provided, should be a single, non-NA, From 4027f063f74842f1a65d1020e94a270e3823acf0 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 31 Jul 2024 16:41:19 -0700 Subject: [PATCH 024/110] docs: more on tidyeval features, as_list_col + names_sep deprecations plus whitespace styling --- R/methods-epi_archive.R | 40 ++++++++++++++++--------------- R/slide.R | 10 +++----- man-roxygen/basic-slide-details.R | 10 ++++---- man-roxygen/basic-slide-params.R | 16 +++++++++---- man/epi_slide.Rd | 35 ++++++++++++++------------- man/epi_slide_mean.Rd | 11 +++++---- man/epi_slide_opt.Rd | 11 +++++---- man/epi_slide_sum.Rd | 11 +++++---- man/epix_slide.Rd | 21 ++++++++-------- 9 files changed, 89 insertions(+), 76 deletions(-) diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index 852fc06a..65b0902a 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -608,23 +608,25 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' `version`s in the `DT` plus the `versions_end`; the spacing of values will #' be guessed (using the GCD of the skips between values). #' @param new_col_name String indicating the name of the new column that will -#' contain the derivative values. Default is "slide_value"; note that setting +#' contain the derivative values. The default is "slide_value" unless your +#' slide computations output data frames, in which case they will be unpacked +#' into the constituent columns and those names used. Note that setting #' `new_col_name` equal to an existing column name will overwrite this column. -#' @param as_list_col Should the slide results be held in a list column, or be -#' [unchopped][tidyr::unchop]/[unnested][tidyr::unnest]? Default is `FALSE`, -#' in which case a list object returned by `f` would be unnested (using -#' [`tidyr::unnest()`]), and, if the slide computations output data frames, -#' the names of the resulting columns are given by prepending `new_col_name` -#' to the names of the list elements. -#' @param names_sep String specifying the separator to use in `tidyr::unnest()` -#' when `as_list_col = FALSE`. Default is "_". Using `NULL` drops the prefix -#' from `new_col_name` entirely. #' @param all_versions (Not the same as `all_rows` parameter of `epi_slide`.) If #' `all_versions = TRUE`, then `f` will be passed the version history (all #' `version <= ref_time_value`) for rows having `time_value` between #' `ref_time_value - before` and `ref_time_value`. Otherwise, `f` will be #' passed only the most recent `version` for every unique `time_value`. #' Default is `FALSE`. +#' @param as_list_col `r lifecycle::badge("deprecated")` if you want a list +#' column as output, you can now just directly output a list from your slide +#' computations. Usually this just means wrapping your output in a length-1 +#' list (outputting `list(result)` instead of `result`). +#' @param names_sep `r lifecycle::badge("deprecated")` if you were specifying +#' `names_sep = NULL`, that's no longer needed. If you were using a non-NULL +#' value, you can either directly prefix your slide computation names, or +#' output a list and then later call `tidyr::unnest(slide_output, +#' , names_sep = )`. #' @return A tibble whose columns are: the grouping variables, `time_value`, #' containing the reference time values for the slide computation, and a #' column named according to the `new_col_name` argument, containing the slide @@ -794,15 +796,15 @@ epix_slide <- function( #' @rdname epix_slide #' @export epix_slide.epi_archive <- function( - x, - f, - ..., - before = Inf, - ref_time_values = NULL, - new_col_name = NULL, - all_versions = FALSE, - as_list_col = deprecated(), - names_sep = deprecated()) { + x, + f, + ..., + before = Inf, + ref_time_values = NULL, + new_col_name = NULL, + all_versions = FALSE, + as_list_col = deprecated(), + names_sep = deprecated()) { # For an "ungrouped" slide, treat all rows as belonging to one big # group (group by 0 vars), like `dplyr::summarize`, and let the # resulting `grouped_epi_archive` handle the slide: diff --git a/R/slide.R b/R/slide.R index 3ba46a81..c7de98a2 100644 --- a/R/slide.R +++ b/R/slide.R @@ -27,14 +27,10 @@ #' and can also refer to `.x`, `.group_key`, and `.ref_time_value`. See #' details. #' @param new_col_name String indicating the name of the new column that will -#' contain the derivative values. Default is "slide_value"; note that setting +#' contain the derivative values. The default is "slide_value" unless your +#' slide computations output data frames, in which case they will be unpacked +#' into the constituent columns and those names used. Note that setting #' `new_col_name` equal to an existing column name will overwrite this column. -#' @param as_list_col Should the slide results be held in a list column, or be -#' [unchopped][tidyr::unchop]/[unnested][tidyr::unnest]? Default is `FALSE`, -#' in which case a list object returned by `f` would be unnested (using -#' [`tidyr::unnest()`]), and, if the slide computations output data frames, -#' the names of the resulting columns are given by prepending `new_col_name` -#' to the names of the list elements. #' #' @template basic-slide-details #' diff --git a/man-roxygen/basic-slide-details.R b/man-roxygen/basic-slide-details.R index a82ca541..4f606311 100644 --- a/man-roxygen/basic-slide-details.R +++ b/man-roxygen/basic-slide-details.R @@ -31,12 +31,14 @@ #' In a manner similar to [`dplyr::mutate`]: #' * Expressions evaluating to length-1 vectors will be recycled to #' appropriate lengths. +#' * `, name_var := value` can be used to set the output column name based on +#' a variable `name_var` rather than requiring you to use a hard-coded +#' name. (The leading comma is needed to make sure that `f` is treated as +#' missing.) #' * `= NULL` can be used to remove results from previous expressions (though #' we don't allow it to remove pre-existing columns). -#' * Unnamed expressions evaluating to data frames will be unpacked into -#' multiple columns in the result; to use this feature, you will need to add -#' an extra comma before your first data-masking expression to make sure `f` -#' appears as missing. +#' * `, fn_returning_a_data_frame(.x)` will unpack the output of the function +#' into multiple columns in the result. #' * Named expressions evaluating to data frames will be placed into #' [`tidyr::pack`]ed columns. #' diff --git a/man-roxygen/basic-slide-params.R b/man-roxygen/basic-slide-params.R index 7e169af6..f556f540 100644 --- a/man-roxygen/basic-slide-params.R +++ b/man-roxygen/basic-slide-params.R @@ -29,9 +29,6 @@ #' element of this vector serves as the reference time point for one sliding #' window. If missing, then this will be set to all unique time values in the #' underlying data table, by default. -#' @param names_sep String specifying the separator to use in `tidyr::unnest()` -#' when `as_list_col = FALSE`. Default is "_". Using `NULL` drops the prefix -#' from `new_col_name` entirely. #' @param all_rows If `all_rows = TRUE`, then all rows of `x` will be kept in #' the output even with `ref_time_values` provided, with some type of missing #' value marker for the slide computation output column(s) for `time_value`s @@ -42,5 +39,14 @@ #' the missing marker is a `NULL` entry in the list column; for certain #' operations, you might want to replace these `NULL` entries with a different #' `NA` marker. -#' @return An `epi_df` object given by appending one or more new columns to -#' `x`, named according to the `new_col_name` argument. +#' @param as_list_col `r lifecycle::badge("deprecated")` if you want a list +#' column as output, you can now just directly output a list from your slide +#' computations. Usually this just means wrapping your output in a length-1 +#' list (outputting `list(result)` instead of `result`). +#' @param names_sep `r lifecycle::badge("deprecated")` if you were specifying +#' `names_sep = NULL`, that's no longer needed. If you were using a non-NULL +#' value, you can either directly prefix your slide computation names, or +#' output a list and then later call `tidyr::unnest(slide_output, +#' , names_sep = )`. +#' @return An `epi_df` object given by appending one or more new columns to `x`, +#' named according to the `new_col_name` argument. diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index 98dd30a0..9eea2442 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -77,7 +77,9 @@ window. If missing, then this will be set to all unique time values in the underlying data table, by default.} \item{new_col_name}{String indicating the name of the new column that will -contain the derivative values. Default is "slide_value"; note that setting +contain the derivative values. The default is "slide_value" unless your +slide computations output data frames, in which case they will be unpacked +into the constituent columns and those names used. Note that setting \code{new_col_name} equal to an existing column name will overwrite this column.} \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in @@ -91,20 +93,19 @@ the missing marker is a \code{NULL} entry in the list column; for certain operations, you might want to replace these \code{NULL} entries with a different \code{NA} marker.} -\item{as_list_col}{Should the slide results be held in a list column, or be -\link[tidyr:chop]{unchopped}/\link[tidyr:unnest]{unnested}? Default is \code{FALSE}, -in which case a list object returned by \code{f} would be unnested (using -\code{\link[tidyr:unnest]{tidyr::unnest()}}), and, if the slide computations output data frames, -the names of the resulting columns are given by prepending \code{new_col_name} -to the names of the list elements.} +\item{as_list_col}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you want a list +column as output, you can now just directly output a list from your slide +computations. Usually this just means wrapping your output in a length-1 +list (outputting \code{list(result)} instead of \code{result}).} -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} +\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying +\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL +value, you can either directly prefix your slide computation names, or +output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} } \value{ -An \code{epi_df} object given by appending one or more new columns to -\code{x}, named according to the \code{new_col_name} argument. +An \code{epi_df} object given by appending one or more new columns to \code{x}, +named according to the \code{new_col_name} argument. } \description{ Slides a given function over variables in an \code{epi_df} object. See the @@ -147,12 +148,14 @@ In a manner similar to \code{\link[dplyr:mutate]{dplyr::mutate}}: \itemize{ \item Expressions evaluating to length-1 vectors will be recycled to appropriate lengths. +\item \verb{, name_var := value} can be used to set the output column name based on +a variable \code{name_var} rather than requiring you to use a hard-coded +name. (The leading comma is needed to make sure that \code{f} is treated as +missing.) \item \verb{= NULL} can be used to remove results from previous expressions (though we don't allow it to remove pre-existing columns). -\item Unnamed expressions evaluating to data frames will be unpacked into -multiple columns in the result; to use this feature, you will need to add -an extra comma before your first data-masking expression to make sure \code{f} -appears as missing. +\item \verb{, fn_returning_a_data_frame(.x)} will unpack the output of the function +into multiple columns in the result. \item Named expressions evaluating to data frames will be placed into \code{\link[tidyr:pack]{tidyr::pack}}ed columns. } diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index dab30653..ab9a4d4c 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -88,13 +88,14 @@ operations, you might want to replace these \code{NULL} entries with a different \item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} +\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying +\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL +value, you can either directly prefix your slide computation names, or +output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} } \value{ -An \code{epi_df} object given by appending one or more new columns to -\code{x}, named according to the \code{new_col_name} argument. +An \code{epi_df} object given by appending one or more new columns to \code{x}, +named according to the \code{new_col_name} argument. } \description{ Slides an n-timestep mean over variables in an \code{epi_df} object. See the \href{https://cmu-delphi.github.io/epiprocess/articles/slide.html}{slide vignette} for diff --git a/man/epi_slide_opt.Rd b/man/epi_slide_opt.Rd index 3de951f9..a984c546 100644 --- a/man/epi_slide_opt.Rd +++ b/man/epi_slide_opt.Rd @@ -109,13 +109,14 @@ operations, you might want to replace these \code{NULL} entries with a different \item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} +\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying +\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL +value, you can either directly prefix your slide computation names, or +output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} } \value{ -An \code{epi_df} object given by appending one or more new columns to -\code{x}, named according to the \code{new_col_name} argument. +An \code{epi_df} object given by appending one or more new columns to \code{x}, +named according to the \code{new_col_name} argument. } \description{ Slides an n-timestep \link[data.table:froll]{data.table::froll} or \link[slider:summary-slide]{slider::summary-slide} function diff --git a/man/epi_slide_sum.Rd b/man/epi_slide_sum.Rd index 5583880b..d05948c8 100644 --- a/man/epi_slide_sum.Rd +++ b/man/epi_slide_sum.Rd @@ -88,13 +88,14 @@ operations, you might want to replace these \code{NULL} entries with a different \item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} +\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying +\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL +value, you can either directly prefix your slide computation names, or +output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} } \value{ -An \code{epi_df} object given by appending one or more new columns to -\code{x}, named according to the \code{new_col_name} argument. +An \code{epi_df} object given by appending one or more new columns to \code{x}, +named according to the \code{new_col_name} argument. } \description{ Slides an n-timestep sum over variables in an \code{epi_df} object. See the \href{https://cmu-delphi.github.io/epiprocess/articles/slide.html}{slide vignette} for diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index 2eb40b1c..5dc8f22c 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -96,7 +96,9 @@ set to a regularly-spaced sequence of values set to cover the range of be guessed (using the GCD of the skips between values).} \item{new_col_name}{String indicating the name of the new column that will -contain the derivative values. Default is "slide_value"; note that setting +contain the derivative values. The default is "slide_value" unless your +slide computations output data frames, in which case they will be unpacked +into the constituent columns and those names used. Note that setting \code{new_col_name} equal to an existing column name will overwrite this column.} \item{all_versions}{(Not the same as \code{all_rows} parameter of \code{epi_slide}.) If @@ -106,16 +108,15 @@ contain the derivative values. Default is "slide_value"; note that setting passed only the most recent \code{version} for every unique \code{time_value}. Default is \code{FALSE}.} -\item{as_list_col}{Should the slide results be held in a list column, or be -\link[tidyr:chop]{unchopped}/\link[tidyr:unnest]{unnested}? Default is \code{FALSE}, -in which case a list object returned by \code{f} would be unnested (using -\code{\link[tidyr:unnest]{tidyr::unnest()}}), and, if the slide computations output data frames, -the names of the resulting columns are given by prepending \code{new_col_name} -to the names of the list elements.} +\item{as_list_col}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you want a list +column as output, you can now just directly output a list from your slide +computations. Usually this just means wrapping your output in a length-1 +list (outputting \code{list(result)} instead of \code{result}).} -\item{names_sep}{String specifying the separator to use in \code{tidyr::unnest()} -when \code{as_list_col = FALSE}. Default is "_". Using \code{NULL} drops the prefix -from \code{new_col_name} entirely.} +\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying +\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL +value, you can either directly prefix your slide computation names, or +output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} } \value{ A tibble whose columns are: the grouping variables, \code{time_value}, From 21609213e18d382581906ddaeb2eacdcbac11236 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 15:19:53 -0700 Subject: [PATCH 025/110] Check deprecations earlier in fns, correct the `when` args --- R/grouped_epi_archive.R | 14 ++++++-------- R/slide.R | 8 ++++---- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 4d81c950..e026a0fe 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -236,6 +236,12 @@ epix_slide.grouped_epi_archive <- function( results with a manual join instead. ", class = "epiprocess__epix_slide_all_rows_parameter_deprecated") } + if (lifecycle::is_present(as_list_col)) { + lifecycle::deprecate_stop("0.8.1", "epix_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead.") + } + if (lifecycle::is_present(names_sep)) { + lifecycle::deprecate_stop("0.8.1", "epix_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + } if (is.null(ref_time_values)) { ref_time_values <- epix_slide_ref_time_values_default(x$private$ungrouped) @@ -262,14 +268,6 @@ epix_slide.grouped_epi_archive <- function( # Validate rest of parameters: assert_logical(all_versions, len = 1L) - if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_stop("0.7.12", "epix_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead.") - } - - if (lifecycle::is_present(names_sep)) { - lifecycle::deprecate_stop("0.7.12", "epix_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") - } - # Computation for one group, one time value comp_one_grp <- function(.data_group, .group_key, f, ..., diff --git a/R/slide.R b/R/slide.R index c7de98a2..6f7fba25 100644 --- a/R/slide.R +++ b/R/slide.R @@ -127,11 +127,11 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = validate_slide_window_arg(after, attr(x, "metadata")$time_type) if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_stop("0.7.12", "epi_slide_opt(as_list_col =)") + lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(as_list_col =)") } if (lifecycle::is_present(names_sep)) { - lifecycle::deprecate_stop("0.7.12", "epi_slide_opt(names_sep =)") + lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(names_sep =)") } # Arrange by increasing time_value @@ -404,11 +404,11 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref } if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_stop("0.7.12", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate.") + lifecycle::deprecate_stop("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate.") } if (lifecycle::is_present(names_sep)) { - lifecycle::deprecate_stop("0.7.12", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + lifecycle::deprecate_stop("0.8.1", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") } # Check that slide function `f` is one of those short-listed from From 90b7e2f519389ef5a1ec5e52e67d7defa90a54f7 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 15:22:03 -0700 Subject: [PATCH 026/110] Fix tidyeval breaking on dot-prefixed column names --- R/utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index 684a7bcc..9c0d7726 100644 --- a/R/utils.R +++ b/R/utils.R @@ -351,7 +351,7 @@ as_slide_computation <- function(f, ...) { ", class = "epiprocess__invalid_slide_comp_tidyeval_output") } } - validate_tibble(new_tibble(as.list(results_env)[results_names])) + validate_tibble(new_tibble(as.list(results_env, all.names = TRUE)[results_names])) } return(fn) From 1f410fc862ef3fa6b5807ce82da2681e78625e35 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 18:03:10 -0700 Subject: [PATCH 027/110] fix: Actually complete workaround for tsibble:::as_tibble.grouped_df --- R/methods-epi_df.R | 18 +++++++++--------- tests/testthat/test-as_tibble-decay.R | 2 -- tests/testthat/test-methods-epi_df.R | 2 -- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index 64c1115c..34709f32 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -13,17 +13,17 @@ #' @importFrom tibble as_tibble #' @export as_tibble.epi_df <- function(x, ...) { - # Decaying drops the class and metadata. `as_tibble.grouped_df` drops the - # grouping and should be called by `NextMethod()` in the current design. - # See #223 for discussion of alternatives. + # Note that some versions of `tsibble` overwrite `as_tibble.grouped_df`, which + # also impacts grouped `epi_df`s don't rely on `NextMethod()`. Destructure + # first instead. + destructured <- tibble::as_tibble(vctrs::vec_data(x), ...) if (attr(x, "decay_to_tibble") %||% TRUE) { - # Note that some versions of `tsibble` overwrite `as_tibble.grouped_df`, which - # also impacts grouped `epi_df`s don't rely on `NextMethod()`. Destructure - # first instead. - return(tibble::as_tibble(vctrs::vec_data(x), ...)) + return(destructured) + } else { + # We specially requested via attr not to decay epi_df-ness but to drop any + # grouping. + reclass(destructured, attr(x, "metadata")) } - metadata <- attr(x, "metadata") - reclass(NextMethod(), metadata) } #' Convert to tsibble format diff --git a/tests/testthat/test-as_tibble-decay.R b/tests/testthat/test-as_tibble-decay.R index 488ace63..d2248a6d 100644 --- a/tests/testthat/test-as_tibble-decay.R +++ b/tests/testthat/test-as_tibble-decay.R @@ -8,8 +8,6 @@ test_that("as_tibble checks an attr to avoid decay to tibble", { }) test_that("as_tibble ungroups if needed", { - # tsibble is doing some method piracy, and overwriting as_tibble.grouped_df as of 1.1.5 - skip_if(packageVersion("tsibble") > "1.1.4") edf <- jhu_csse_daily_subset %>% group_by(geo_value) # removes the grouped_df class expect_identical(class(as_tibble(edf)), c("tbl_df", "tbl", "data.frame")) diff --git a/tests/testthat/test-methods-epi_df.R b/tests/testthat/test-methods-epi_df.R index 16b5c873..ca971d65 100644 --- a/tests/testthat/test-methods-epi_df.R +++ b/tests/testthat/test-methods-epi_df.R @@ -131,8 +131,6 @@ test_that("Metadata is dropped by `as_tibble`", { }) test_that("Grouping are dropped by `as_tibble`", { - # tsibble is doing some method piracy, and overwriting as_tibble.grouped_df as of 1.1.5 - skip_if(packageVersion("tsibble") > "1.1.4") grouped_converted <- toy_epi_df %>% group_by(geo_value) %>% as_tibble() From 512c6bac2d40bdfab1172a3f3465756403990d64 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 18:04:08 -0700 Subject: [PATCH 028/110] refactor(slide.R): move slide_one_grp definition after input munging --- R/slide.R | 64 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/R/slide.R b/R/slide.R index 6f7fba25..16108532 100644 --- a/R/slide.R +++ b/R/slide.R @@ -141,6 +141,39 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = starts <- ref_time_values - before stops <- ref_time_values + after + # If `f` is missing, interpret ... as an expression for tidy evaluation + if (missing(f)) { + used_data_masking <- TRUE + quosures <- enquos(...) + if (length(quosures) == 0) { + cli_abort("If `f` is missing then a computation must be specified via `...`.") + } + + f <- quosures + # Magic value that passes zero args as dots in calls below. Equivalent to + # `... <- missing_arg()`, but use `assign` to avoid warning about + # improper use of dots. + assign("...", missing_arg()) + } else { + used_data_masking <- FALSE + } + + f <- as_slide_computation(f, ...) + + # Create a wrapper that calculates and passes `.ref_time_value` to the + # computation. `i` is contained in the `f_wrapper_factory` environment such + # that when called within `slide_one_grp` `i` is reset for every group. + f_wrapper_factory <- function(kept_ref_time_values) { + # Use `i` to advance through list of start dates. + i <- 1L + f_wrapper <- function(.x, .group_key, ...) { + .ref_time_value <- kept_ref_time_values[[i]] + i <<- i + 1L + f(.x, .group_key, .ref_time_value, ...) + } + return(f_wrapper) + } + # Computation for one group, all time values slide_one_grp <- function(.data_group, .group_key, # see `?group_modify` @@ -243,37 +276,6 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = return(result) } - # If `f` is missing, interpret ... as an expression for tidy evaluation - if (missing(f)) { - used_data_masking <- TRUE - quosures <- enquos(...) - if (length(quosures) == 0) { - cli_abort("If `f` is missing then a computation must be specified via `...`.") - } - - f <- quosures - # Magic value that passes zero args as dots in calls below. Equivalent to - # `... <- missing_arg()`, but use `assign` to avoid warning about - # improper use of dots. - assign("...", missing_arg()) - } else { - used_data_masking <- FALSE - } - - f <- as_slide_computation(f, ...) - # Create a wrapper that calculates and passes `.ref_time_value` to the - # computation. `i` is contained in the `f_wrapper_factory` environment such - # that when called within `slide_one_grp` `i` is reset for every group. - f_wrapper_factory <- function(kept_ref_time_values) { - # Use `i` to advance through list of start dates. - i <- 1L - f_wrapper <- function(.x, .group_key, ...) { - .ref_time_value <- kept_ref_time_values[[i]] - i <<- i + 1L - f(.x, .group_key, .ref_time_value, ...) - } - return(f_wrapper) - } x <- group_modify(x, slide_one_grp, ..., f_factory = f_wrapper_factory, From ba536cd733e02cb28e7009626c8d01b7fd44dbb5 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 18:09:43 -0700 Subject: [PATCH 029/110] Fix deprecations referring to wrong functions --- R/slide.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/R/slide.R b/R/slide.R index 16108532..76003ae2 100644 --- a/R/slide.R +++ b/R/slide.R @@ -127,11 +127,11 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = validate_slide_window_arg(after, attr(x, "metadata")$time_type) if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(as_list_col =)") + lifecycle::deprecate_stop("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate.") } if (lifecycle::is_present(names_sep)) { - lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(names_sep =)") + lifecycle::deprecate_stop("0.8.1", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") } # Arrange by increasing time_value @@ -406,11 +406,11 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref } if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_stop("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate.") + lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(as_list_col =)") } if (lifecycle::is_present(names_sep)) { - lifecycle::deprecate_stop("0.8.1", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(names_sep =)") } # Check that slide function `f` is one of those short-listed from From 00c0d85a389ff2768047df1fa691fbe242e5d5ab Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 18:36:19 -0700 Subject: [PATCH 030/110] refactor(epix_slide): don't double-convert tidyeval + better code ordering --- R/grouped_epi_archive.R | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index e026a0fe..b35f23b7 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -268,6 +268,24 @@ epix_slide.grouped_epi_archive <- function( # Validate rest of parameters: assert_logical(all_versions, len = 1L) + # If `f` is missing, interpret ... as an expression for tidy evaluation + if (missing(f)) { + used_data_masking <- TRUE + quosures <- enquos(...) + if (length(quosures) == 0) { + cli_abort("If `f` is missing then a computation must be specified via `...`.") + } + + f <- as_slide_computation(quosures) + # Magic value that passes zero args as dots in calls below. Equivalent to + # `... <- missing_arg()`, but use `assign` to avoid warning about + # improper use of dots. + assign("...", missing_arg()) + } else { + used_data_masking <- FALSE + f <- as_slide_computation(f, ...) + } + # Computation for one group, one time value comp_one_grp <- function(.data_group, .group_key, f, ..., @@ -316,24 +334,6 @@ epix_slide.grouped_epi_archive <- function( return(validate_tibble(new_tibble(res))) } - # If `f` is missing, interpret ... as an expression for tidy evaluation - if (missing(f)) { - used_data_masking <- TRUE - quosures <- enquos(...) - if (length(quosures) == 0) { - cli_abort("If `f` is missing then a computation must be specified via `...`.") - } - - f <- as_slide_computation(quosures) - # Magic value that passes zero args as dots in calls below. Equivalent to - # `... <- missing_arg()`, but use `assign` to avoid warning about - # improper use of dots. - assign("...", missing_arg()) - } else { - used_data_masking <- FALSE - } - - f <- as_slide_computation(f, ...) out <- lapply(ref_time_values, function(ref_time_value) { # Ungrouped as-of data; `epi_df` if `all_versions` is `FALSE`, # `epi_archive` if `all_versions` is `TRUE`: From 70e86a368939614d36884fb4ffce0da27cb67889 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 18:40:27 -0700 Subject: [PATCH 031/110] Soften as_list_col and names_sep deprecations --- R/grouped_epi_archive.R | 20 ++++++++++++++------ R/slide.R | 22 ++++++++++++++-------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index b35f23b7..17c395a1 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -236,12 +236,6 @@ epix_slide.grouped_epi_archive <- function( results with a manual join instead. ", class = "epiprocess__epix_slide_all_rows_parameter_deprecated") } - if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_stop("0.8.1", "epix_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead.") - } - if (lifecycle::is_present(names_sep)) { - lifecycle::deprecate_stop("0.8.1", "epix_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") - } if (is.null(ref_time_values)) { ref_time_values <- epix_slide_ref_time_values_default(x$private$ungrouped) @@ -286,6 +280,20 @@ epix_slide.grouped_epi_archive <- function( f <- as_slide_computation(f, ...) } + if (lifecycle::is_present(as_list_col)) { + lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate. Automatically trying this sort of rewrite...") + f_orig <- f + f <- function(...) list(f_orig(...)) + } + + if (lifecycle::is_present(names_sep)) { + if (is.null(names_sep)) { + lifecycle::deprecate_warn("0.8.1", "epi_slide_opt(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") + } else { + lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + } + } + # Computation for one group, one time value comp_one_grp <- function(.data_group, .group_key, f, ..., diff --git a/R/slide.R b/R/slide.R index 76003ae2..aae12115 100644 --- a/R/slide.R +++ b/R/slide.R @@ -126,14 +126,6 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = validate_slide_window_arg(before, attr(x, "metadata")$time_type) validate_slide_window_arg(after, attr(x, "metadata")$time_type) - if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_stop("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate.") - } - - if (lifecycle::is_present(names_sep)) { - lifecycle::deprecate_stop("0.8.1", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") - } - # Arrange by increasing time_value x <- arrange(x, .data$time_value) @@ -160,6 +152,20 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = f <- as_slide_computation(f, ...) + if (lifecycle::is_present(as_list_col)) { + lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate. Automatically trying this sort of rewrite...") + f_orig <- f + f <- function(...) list(f_orig(...)) + } + + if (lifecycle::is_present(names_sep)) { + if (is.null(names_sep)) { + lifecycle::deprecate_warn("0.8.1", "epi_slide_opt(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") + } else { + lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + } + } + # Create a wrapper that calculates and passes `.ref_time_value` to the # computation. `i` is contained in the `f_wrapper_factory` environment such # that when called within `slide_one_grp` `i` is reset for every group. From 5452bba514d6f35c0f927cf8d45f091619012fee Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 18:51:59 -0700 Subject: [PATCH 032/110] Fix some deprecation message naming and details --- R/grouped_epi_archive.R | 6 +++--- R/slide.R | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 17c395a1..8d442a98 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -281,16 +281,16 @@ epix_slide.grouped_epi_archive <- function( } if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate. Automatically trying this sort of rewrite...") + lifecycle::deprecate_warn("0.8.1", "epix_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless you want more than one list element per computation. Automatically trying this sort of rewrite...") f_orig <- f f <- function(...) list(f_orig(...)) } if (lifecycle::is_present(names_sep)) { if (is.null(names_sep)) { - lifecycle::deprecate_warn("0.8.1", "epi_slide_opt(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") + lifecycle::deprecate_warn("0.8.1", "epix_slide(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") } else { - lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + lifecycle::deprecate_stop("0.8.1", "epix_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") } } diff --git a/R/slide.R b/R/slide.R index aae12115..1ff8cbf1 100644 --- a/R/slide.R +++ b/R/slide.R @@ -160,9 +160,9 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = if (lifecycle::is_present(names_sep)) { if (is.null(names_sep)) { - lifecycle::deprecate_warn("0.8.1", "epi_slide_opt(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") + lifecycle::deprecate_warn("0.8.1", "epi_slide(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") } else { - lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + lifecycle::deprecate_stop("0.8.1", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") } } From dfb249a0b4ef4dae7cbf1dacea04f82f813a9bd1 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 2 Aug 2024 14:57:50 -0700 Subject: [PATCH 033/110] Fix softer deprecation of epi[x]_slide( = , as_list_col = TRUE) --- R/grouped_epi_archive.R | 9 ++++++-- R/slide.R | 48 +++++++++++++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 8d442a98..44a851cb 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -305,8 +305,13 @@ epix_slide.grouped_epi_archive <- function( # If this wasn't a tidyeval computation, we still need to check the output # types. We'll let `group_modify` and `vec_rbind` deal with checking for # type compatibility between the outputs. - if (!used_data_masking && - !(vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)))) { + if (!used_data_masking && !( + # vctrs considers data.frames to be vectors, but we still check + # separately for them because certain base operations output data frames + # with rownames, which we will allow (but might drop) + is.data.frame(comp_value) || + vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)) + )) { cli_abort(" the slide computations must always return data frames or unnamed vectors (as determined by the vctrs package) (and not a mix of these two diff --git a/R/slide.R b/R/slide.R index 1ff8cbf1..71a5d33c 100644 --- a/R/slide.R +++ b/R/slide.R @@ -153,9 +153,39 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = f <- as_slide_computation(f, ...) if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate. Automatically trying this sort of rewrite...") - f_orig <- f - f <- function(...) list(f_orig(...)) + if (!as_list_col) { + lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "You can simply remove as_list_col = FALSE.") + } else { + lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate. Attempting to mimic the effects of such a rewrite, but you may see changes in behavior...") + f_orig <- f + if (!used_data_masking) { + f <- function(...) { + list(f_orig(...)) + } + } else { + f <- function(...) { + # tidyeval pre-as_list_col-deprecation only supported a single, named, + # data-masking expr. So we should have a single column which is a packed + # data.frame, or a non-data.frame. + wrapped_result_orig <- f_orig(...) + if (length(wrapped_result_orig) != 1L) { + cli_abort("Failed to rewrite `as_list_col = TRUE`, which is deprecated: an internal bug was encountered. Please remove `as_list_col = TRUE` and update your slide computation instead.") + } + name_orig <- names(wrapped_result_orig)[[1L]] + result_orig <- wrapped_result_orig[[1L]] + if (is.data.frame(result_orig)) { + # to list of rows: + result_col <- lapply(seq_len(nrow(result_orig)), function(subresult_i) { + result_orig[subresult_i, ] + }) + results_lst <- list(result_col) + } else { + results_lst <- as.list(result_orig) + } + validate_tibble(new_tibble(`names<-`(results_lst, name_orig))) + } + } + } } if (lifecycle::is_present(names_sep)) { @@ -216,13 +246,17 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = # between the outputs. if (!used_data_masking && !all(vapply(slide_values_list, function(comp_value) { - vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)) + # vctrs considers data.frames to be vectors, but we still check + # separately for them because certain base operations output data frames + # with rownames, which we will allow (but might drop) + is.data.frame(comp_value) || + vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)) }, logical(1L))) ) { cli_abort(" - the slide computations must always return data frames or unnamed vectors - (as determined by the vctrs package) (and not a mix of these two - structures). + the slide computations must always return either data frames without rownames + or unnamed vectors (as determined by the vctrs package) (and not a mix + of these two structures). ", class = "epiprocess__invalid_slide_comp_value") } From 7a7e7819228c19d2a79f08b9064b7d19f614aaea Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 2 Aug 2024 16:53:29 -0700 Subject: [PATCH 034/110] fix(epi[x]_slide): again, don't reject (row)named data frames Fix another place where these were being rejected. Not making a helper function yet because this particular instance of the check is in a tight loop and a function call (maybe multiple if we want have a vectorized check) might be substantial overhead. Want to check for performance regressions in existing changes before trying this type of refactor. --- R/utils.R | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/R/utils.R b/R/utils.R index 9c0d7726..983be108 100644 --- a/R/utils.R +++ b/R/utils.R @@ -313,8 +313,13 @@ as_slide_computation <- function(f, ...) { nm <- nms[[quosure_i]] results_names <- results_names[results_names != nm] rlang::env_unbind(results_env, nm) - } else if (vctrs::obj_is_vector(quosure_result_raw) && - is.null(vctrs::vec_names(quosure_result_raw))) { + } else if ( + # vctrs considers data.frames to be vectors, but we still check + # separately for them because certain base operations output data frames + # with rownames, which we will allow (but might drop) + is.data.frame(quosure_result_raw) || + vctrs::obj_is_vector(quosure_result_raw) && is.null(vctrs::vec_names(quosure_result_raw)) + ) { # We want something like `dplyr_col_modify()` but allowing recycling # of previous computations and updating `results_env` and unpacking # tibbles if not manually named. From 418a65a93dce663dff8a2dc35678c495124e876e Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 2 Aug 2024 17:16:25 -0700 Subject: [PATCH 035/110] docs(epi[x]_slide): update NEWS.md, vignettes for breaking changes --- NEWS.md | 16 ++++++++++++++++ vignettes/advanced.Rmd | 14 +++++++------- vignettes/archive.Rmd | 23 +++++++++++++---------- vignettes/slide.Rmd | 19 ++++++++++--------- 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/NEWS.md b/NEWS.md index e1c6a3ee..e49046b4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -8,6 +8,16 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat ## Breaking changes +- In `epi[x]_slide`: + - `names_sep` is deprecated, and if you return data frames from your + computations, they will no longer be unpacked into separate columns with + name prefixes; instead: + - if you don't provide a name for your slide computations, they will be + unpacked into separate columns, just without any name prefixes + - if you do provide a name for your slide computation, it will become a + packed data.frame-class column (see `tidyr::pack`). + - `as_list_col` is deprecated; you can now directly return a list from your + slide computations instead. - `detect_outlr_stl(seasonal_period = NULL)` is no longer accepted. Use `detect_outlr_stl(seasonal_period = , seasonal_as_residual = TRUE)` instead. See `?detect_outlr_stl` for more details. @@ -50,6 +60,12 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat are similar functions for `geo` and `version`). - Fixed bug where `epix_slide_ref_time_values_default()` on datetimes would output a huge number of `ref_time_values` spaced apart by mere seconds. +- In `epi_slide()` and `epix_slide()`: + - Multiple "data-masking" tidy evaluation expressions can be passed in via + `...`, rather than just one. + - Additional tidy evaluation features from `dplyr::mutate` are supported: `!! + name_var := value`, unnamed expressions evaluating to data frames, and `= + NULL`; see `?epi_slide` for more details. ## Cleanup diff --git a/vignettes/advanced.Rmd b/vignettes/advanced.Rmd index 1ea13c5f..3eaafb8d 100644 --- a/vignettes/advanced.Rmd +++ b/vignettes/advanced.Rmd @@ -247,7 +247,7 @@ locations. edf$y <- 2 * edf$x + 0.05 * rnorm(length(edf$x)) edf %>% - epi_slide(function(d, ...) { + epi_slide(function(d, group_key, ref_time_value) { obj <- lm(y ~ x, data = d) return( as.data.frame( @@ -297,7 +297,7 @@ y1 <- pub_covidcast( geo_type = "state", time_type = "day", geo_values = "ca,fl", - time_value = epirange(20200601, 20211201), + time_values = epirange(20200601, 20211201), issues = epirange(20200601, 20211201) ) @@ -307,7 +307,7 @@ y2 <- pub_covidcast( geo_type = "state", time_type = "day", geo_values = "ca,fl", - time_value = epirange(20200601, 20211201), + time_values = epirange(20200601, 20211201), issues = epirange(20200601, 20211201) ) @@ -475,7 +475,7 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { ) %>% mutate( target_date = .data$time_value + ahead, as_of = TRUE, - geo_value = .data$fc_geo_value + geo_value = .data$fc$geo_value ) } else { x_latest %>% @@ -503,13 +503,13 @@ fc <- bind_rows( # Plot them, on top of latest COVID-19 case rates ggplot(fc, aes(x = target_date, group = time_value, fill = as_of)) + - geom_ribbon(aes(ymin = fc_lower, ymax = fc_upper), alpha = 0.4) + + geom_ribbon(aes(ymin = fc$lower, ymax = fc$upper), alpha = 0.4) + geom_line( data = x_latest, aes(x = time_value, y = case_rate_7d_av), inherit.aes = FALSE, color = "gray50" ) + - geom_line(aes(y = fc_point)) + - geom_point(aes(y = fc_point), size = 0.5) + + geom_line(aes(y = fc$point)) + + geom_point(aes(y = fc$point), size = 0.5) + geom_vline(aes(xintercept = time_value), linetype = 2, alpha = 0.5) + facet_grid(vars(geo_value), vars(as_of), scales = "free") + scale_x_date(minor_breaks = "month", date_labels = "%b %y") + diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 686f558f..c8543534 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -338,13 +338,16 @@ z <- x %>% head(z, 10) ``` -We get back a tibble `z` with the grouping variables (here geo value), the time -values, and three columns `fc_point`, `fc_lower`, and `fc_upper` produced by the -slide computation that correspond to the point forecast, and the lower and upper -endpoints of the 95\% prediction band, respectively. (If instead we had set -`as_list_col = TRUE` in the call to `epix_slide()`, then we would have gotten a -list column `fc`, where each element of `fc` is a data frame with named columns -`point`, `lower`, and `upper`.) + + +We get back a tibble `z` with the grouping variables (here geo value), the +(reference) time values, and a ["packed"][tidyr::pack] data frame column `fc` +containing `fc$point`, `fc$lower`, and `fc$upper` that correspond to the point +forecast, and the lower and upper endpoints of the 95\% prediction band, +respectively. (We could also have used `, prob_ar(cases_7dav)` to get three +separate columns `point`, `lower`, and `upper`, or used `fc = +list(prob_ar(cases_7dav))` to make an `fc` column with a ["nested"][tidyr::nest] +format (list of data frames) instead.) On the whole, `epix_slide()` works similarly to `epix_slide()`, though there are a few notable differences, even apart from the version-aware aspect. You can @@ -395,13 +398,13 @@ fc <- bind_rows( # Plot them, on top of latest COVID-19 case rates ggplot(fc, aes(x = target_date, group = time_value, fill = as_of)) + - geom_ribbon(aes(ymin = fc_lower, ymax = fc_upper), alpha = 0.4) + + geom_ribbon(aes(ymin = fc$lower, ymax = fc$upper), alpha = 0.4) + geom_line( data = x_latest, aes(x = time_value, y = case_rate_7d_av), inherit.aes = FALSE, color = "gray50" ) + - geom_line(aes(y = fc_point)) + - geom_point(aes(y = fc_point), size = 0.5) + + geom_line(aes(y = fc$point)) + + geom_point(aes(y = fc$point), size = 0.5) + geom_vline(aes(xintercept = time_value), linetype = 2, alpha = 0.5) + facet_grid(vars(geo_value), vars(as_of), scales = "free") + scale_x_date(minor_breaks = "month", date_labels = "%b %y") + diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 92590fb1..8264a963 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -263,12 +263,13 @@ x %>% Note that here we have utilized an argument `ref_time_values` to perform the sliding computation (here, compute a forecast) at a specific subset of reference -time values. We get out three columns `fc_point`, `fc_lower`, and `fc_upper` -that correspond to the point forecast, and the lower and upper endpoints of the -95\% prediction band, respectively. (If instead we had set `as_list_col = TRUE` -in the call to `epi_slide()`, then we would have gotten a list column `fc`, -where each element of `fc` is a data frame with named columns `point`, `lower`, -and `upper`.) +time values. We get out a ["packed"][tidyr::pack] data frame column `fc` +containing `fc$point`, `fc$lower`, and `fc$upper` that correspond to the point +forecast, and the lower and upper endpoints of the 95\% prediction band, +respectively. (We could also have used `, prob_ar(cases_7dav)` to get three +separate columns `point`, `lower`, and `upper`, or used `fc = +list(prob_ar(cases_7dav))` to make an `fc` column with a ["nested"][tidyr::nest] +format (list of data frames) instead.) To finish off, we plot the forecasts at some times (spaced out by a few months) over the last year, at multiple horizons: 7, 14, 21, and 28 days ahead. To do @@ -300,11 +301,11 @@ z <- bind_rows( ggplot(z) + geom_line(aes(x = time_value, y = cases_7dav), color = "gray50") + geom_ribbon(aes( - x = target_date, ymin = fc_lower, ymax = fc_upper, + x = target_date, ymin = fc$lower, ymax = fc$upper, group = time_value ), fill = 6, alpha = 0.4) + - geom_line(aes(x = target_date, y = fc_point, group = time_value)) + - geom_point(aes(x = target_date, y = fc_point, group = time_value), + geom_line(aes(x = target_date, y = fc$point, group = time_value)) + + geom_point(aes(x = target_date, y = fc$point, group = time_value), size = 0.5 ) + geom_vline( From 0d794c6969798ce292290e2fdad0d24198f14c93 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 5 Aug 2024 14:58:38 -0700 Subject: [PATCH 036/110] Linting, nolinting, and nonolinting --- R/grouped_epi_archive.R | 8 ++++---- R/slide.R | 10 +++++----- R/utils.R | 12 +++++------- tests/testthat/test-epi_slide.R | 16 ++++++++-------- tests/testthat/test-grouped_epi_archive.R | 14 -------------- 5 files changed, 22 insertions(+), 38 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 44a851cb..cec20f62 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -256,7 +256,7 @@ epix_slide.grouped_epi_archive <- function( checkmate::assert_string(new_col_name, null.ok = TRUE) if (identical(new_col_name, "time_value")) { - cli_abort('`new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation') + cli_abort('`new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation') # nolint: line_length_linter } # Validate rest of parameters: @@ -281,16 +281,16 @@ epix_slide.grouped_epi_archive <- function( } if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_warn("0.8.1", "epix_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless you want more than one list element per computation. Automatically trying this sort of rewrite...") + lifecycle::deprecate_warn("0.8.1", "epix_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless you want more than one list element per computation. Automatically trying this sort of rewrite...") # nolint: line_length_linter f_orig <- f f <- function(...) list(f_orig(...)) } if (lifecycle::is_present(names_sep)) { if (is.null(names_sep)) { - lifecycle::deprecate_warn("0.8.1", "epix_slide(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") + lifecycle::deprecate_warn("0.8.1", "epix_slide(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") # nolint: line_length_linter } else { - lifecycle::deprecate_stop("0.8.1", "epix_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + lifecycle::deprecate_stop("0.8.1", "epix_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") # nolint: line_length_linter } } diff --git a/R/slide.R b/R/slide.R index 71a5d33c..4617b387 100644 --- a/R/slide.R +++ b/R/slide.R @@ -154,9 +154,9 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = if (lifecycle::is_present(as_list_col)) { if (!as_list_col) { - lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "You can simply remove as_list_col = FALSE.") + lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "You can simply remove as_list_col = FALSE.") # nolint: line_length_linter } else { - lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate. Attempting to mimic the effects of such a rewrite, but you may see changes in behavior...") + lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate. Attempting to mimic the effects of such a rewrite, but you may see changes in behavior...") # nolint: line_length_linter f_orig <- f if (!used_data_masking) { f <- function(...) { @@ -169,7 +169,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = # data.frame, or a non-data.frame. wrapped_result_orig <- f_orig(...) if (length(wrapped_result_orig) != 1L) { - cli_abort("Failed to rewrite `as_list_col = TRUE`, which is deprecated: an internal bug was encountered. Please remove `as_list_col = TRUE` and update your slide computation instead.") + cli_abort("Failed to rewrite `as_list_col = TRUE`, which is deprecated: an internal bug was encountered. Please remove `as_list_col = TRUE` and update your slide computation instead.") # nolint: line_length_linter } name_orig <- names(wrapped_result_orig)[[1L]] result_orig <- wrapped_result_orig[[1L]] @@ -190,9 +190,9 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = if (lifecycle::is_present(names_sep)) { if (is.null(names_sep)) { - lifecycle::deprecate_warn("0.8.1", "epi_slide(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") + lifecycle::deprecate_warn("0.8.1", "epi_slide(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") # nolint: line_length_linter } else { - lifecycle::deprecate_stop("0.8.1", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") + lifecycle::deprecate_stop("0.8.1", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") # nolint: line_length_linter } } diff --git a/R/utils.R b/R/utils.R index 983be108..2d711333 100644 --- a/R/utils.R +++ b/R/utils.R @@ -286,12 +286,10 @@ as_slide_computation <- function(f, ...) { if (rlang::is_quosures(f)) { quosures <- rlang::quos_auto_name(f) # resolves := among other things nms <- names(quosures) - manually_named <- - rlang::names2(f) != "" | - vapply(f, function(quosure) { - expression <- rlang::quo_get_expr(quosure) - is.call(expression) && expression[[1L]] == rlang::sym(":=") - }, FUN.VALUE = logical(1L)) + manually_named <- rlang::names2(f) != "" | vapply(f, function(quosure) { + expression <- rlang::quo_get_expr(quosure) + is.call(expression) && expression[[1L]] == rlang::sym(":=") + }, FUN.VALUE = logical(1L)) fn <- function(.x, .group_key, .ref_time_value) { x_as_env <- rlang::as_environment(.x) results_env <- new.env(parent = x_as_env) @@ -370,7 +368,7 @@ as_slide_computation <- function(f, ...) { if (is_formula(f)) { if (is_quosure(f)) { - cli_abort("`f` argument to `as_slide_computation()` cannot be a `quosure`; it should probably be a `quosures`. This is likely an internal bug in `{{epiprocess}}`.") + cli_abort("`f` argument to `as_slide_computation()` cannot be a `quosure`; it should probably be a `quosures`. This is likely an internal bug in `{{epiprocess}}`.") # nolint: line_length_linter } if (length(f) > 2) { diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index e2ce21bb..4b53060d 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -312,14 +312,14 @@ test_that("epi_slide outputs list columns when desired, and unpacks unnamed comp }) test_that("epi_slide can use sequential data masking expressions including NULL", { - edf_A <- tibble::tibble( + edf_a <- tibble::tibble( geo_value = 1, time_value = 1:10, value = 1:10 ) %>% as_epi_df(as_of = 12L) - noisiness_A1 <- edf_A %>% + noisiness_a1 <- edf_a %>% group_by(geo_value) %>% epi_slide( before = 1L, after = 2L, @@ -332,23 +332,23 @@ test_that("epi_slide can use sequential data masking expressions including NULL" filter(valid) %>% select(-valid) - noisiness_A0 <- edf_A %>% + noisiness_a0 <- edf_a %>% filter( time_value >= min(time_value) + 1L, time_value <= max(time_value) - 2L ) %>% mutate(noisiness = sqrt((3 - 1.5)^2 + (4 - 1.5)^2) / sqrt(2)) - expect_identical(noisiness_A1, noisiness_A0) + expect_identical(noisiness_a1, noisiness_a0) - edf_B <- tibble::tibble( + edf_b <- tibble::tibble( geo_value = 1, time_value = 1:10, value = rep(1:2, 5L) ) %>% as_epi_df(as_of = 12L) - noisiness_B1 <- edf_B %>% + noisiness_b1 <- edf_b %>% group_by(geo_value) %>% epi_slide( before = 1L, after = 2L, @@ -363,14 +363,14 @@ test_that("epi_slide can use sequential data masking expressions including NULL" filter(valid) %>% select(-valid) - noisiness_B0 <- edf_B %>% + noisiness_b0 <- edf_b %>% filter( time_value >= min(time_value) + 1L, time_value <= max(time_value) - 2L ) %>% mutate(noisiness = sqrt((1 - 3)^2 + (2 - 4)^2) / sqrt(2)) - expect_equal(noisiness_B1, noisiness_B0) + expect_equal(noisiness_b1, noisiness_b0) }) test_that("epi_slide complains on invalid computation outputs", { diff --git a/tests/testthat/test-grouped_epi_archive.R b/tests/testthat/test-grouped_epi_archive.R index 413741aa..e2a32383 100644 --- a/tests/testthat/test-grouped_epi_archive.R +++ b/tests/testthat/test-grouped_epi_archive.R @@ -62,20 +62,6 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { age_group = ordered(age_group, c("pediatric", "adult")), time_value = as.Date(time_value) ) %>% - # nolint start: commented_code_linter. - # # See - # # https://github.com/cmu-delphi/epiprocess/pull/290#issuecomment-1489099157 - # # and - # # https://github.com/cmu-delphi/epiprocess/pull/311#issuecomment-1535149256 - # # for why this is commented out, pending some design - # # decisions. - # # - # as_epi_df(geo_type = "nation", # bug; want "custom" from NA; issue #242 - # as_of = as.Date("2000-01-03"), - # additional_metadata = list(other_keys = "age_group")) %>% - # # put back in expected order; see issue #166: - # select(age_group, geo_value, time_value, s) %>% - # nolint end group_by(age_group, geo_value, .drop = FALSE) ) expect_identical( From f53f3316a1d812a312d8856c019cd96565920ea5 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 15 Aug 2024 13:23:32 -0700 Subject: [PATCH 037/110] refactor: explain how tidyeval column redefinition actually works out --- R/slide.R | 4 +++- R/utils.R | 25 ++++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/R/slide.R b/R/slide.R index 4617b387..1a2810f5 100644 --- a/R/slide.R +++ b/R/slide.R @@ -305,7 +305,9 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = mutate(.data_group, !!new_col_name := slide_values) } else { if (inherits(slide_values, "data.frame")) { - # unpack into separate columns (without name prefix): + # unpack into separate columns (without name prefix) and, if there are + # re-bindings, make the last one win for determining column value & + # column placement: mutate(.data_group, slide_values) } else { # apply default name: diff --git a/R/utils.R b/R/utils.R index 2d711333..dd3d4fca 100644 --- a/R/utils.R +++ b/R/utils.R @@ -303,13 +303,19 @@ as_slide_computation <- function(f, ...) { data_mask$.group_key <- .group_key data_mask$.ref_time_value <- .ref_time_value common_size <- NULL - results_names <- character(0L) # track ordering; env doesn't + # The data mask is an environment; it doesn't track the binding order. + # We'll track that separately. For efficiency, we'll use `c` to add to + # this order, and deal with binding redefinitions at the end. We'll + # reflect deletions immediately (current implementation of `new_tibble` + # seems like it would exclude `NULL` bindings for us but `?new_tibble` + # doesn't reflect this behavior). + results_multiorder <- character(0L) for (quosure_i in seq_along(f)) { # XXX could capture and improve error messages here at cost of recover()ability quosure_result_raw <- rlang::eval_tidy(quosures[[quosure_i]], data_mask) if (is.null(quosure_result_raw)) { nm <- nms[[quosure_i]] - results_names <- results_names[results_names != nm] + results_multiorder <- results_multiorder[results_multiorder != nm] rlang::env_unbind(results_env, nm) } else if ( # vctrs considers data.frames to be vectors, but we still check @@ -335,14 +341,14 @@ as_slide_computation <- function(f, ...) { } # else `common_size` remains NULL } if (inherits(quosure_result_recycled, "data.frame") && !manually_named[[quosure_i]]) { - new_results_names <- names(quosure_result_recycled) - results_names <- c(results_names, new_results_names) + new_results_multiorder <- names(quosure_result_recycled) + results_multiorder <- c(results_multiorder, new_results_multiorder) for (new_result_i in seq_along(quosure_result_recycled)) { - results_env[[new_results_names[[new_result_i]]]] <- quosure_result_recycled[[new_result_i]] + results_env[[new_results_multiorder[[new_result_i]]]] <- quosure_result_recycled[[new_result_i]] } } else { nm <- nms[[quosure_i]] - results_names <- c(results_names, nm) + results_multiorder <- c(results_multiorder, nm) results_env[[nm]] <- quosure_result_recycled } } else { @@ -354,7 +360,12 @@ as_slide_computation <- function(f, ...) { ", class = "epiprocess__invalid_slide_comp_tidyeval_output") } } - validate_tibble(new_tibble(as.list(results_env, all.names = TRUE)[results_names])) + # If a binding was defined and redefined, we may have duplications within + # `results_multiorder`. `unique(results_multiorder, fromLast = TRUE)` is + # actually quite slow, so we'll keep the duplicates (--> duplicate result + # columns) and leave it to various `mutate` in epi[x]_slide to resolve + # this to the appropriate placement: + validate_tibble(new_tibble(as.list(results_env, all.names = TRUE)[results_multiorder])) } return(fn) From 5cfa1215769c76c4c43db5cdc121ce014bba9b01 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 21 Aug 2024 03:26:50 -0700 Subject: [PATCH 038/110] refactor(epi[x]_slide): rearrange new_col_name logic branches `if(!is.null(new_col_name)) {[...]} else {[...]}` felt a bit confusing. Keeping `if (!is.null(common_size)) {[...]} else {[...]}` elsewhere because then-branch is a happy+simple case, and the overhead seems negligible. --- R/grouped_epi_archive.R | 10 +++++----- R/slide.R | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index cec20f62..f6ae0419 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -325,11 +325,7 @@ epix_slide.grouped_epi_archive <- function( # named / unpacked, for quick feedback) res <- list(time_value = vctrs::vec_rep(ref_time_value, vctrs::vec_size(comp_value))) - if (!is.null(new_col_name)) { - # vector or packed data.frame-type column (note: new_col_name of - # "time_value" is disallowed): - res[[new_col_name]] <- comp_value - } else { + if (is.null(new_col_name)) { if (inherits(comp_value, "data.frame")) { # unpack into separate columns (without name prefix): res <- c(res, comp_value) @@ -337,6 +333,10 @@ epix_slide.grouped_epi_archive <- function( # apply default name (to vector or packed data.frame-type column): res[["slide_value"]] <- comp_value } + } else { + # vector or packed data.frame-type column (note: new_col_name of + # "time_value" is disallowed): + res[[new_col_name]] <- comp_value } # Stop on naming conflicts (names() fine here, non-NULL). Not the diff --git a/R/slide.R b/R/slide.R index 1a2810f5..6f0f4769 100644 --- a/R/slide.R +++ b/R/slide.R @@ -300,10 +300,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = } result <- - if (!is.null(new_col_name)) { - # vector or packed data.frame-type column: - mutate(.data_group, !!new_col_name := slide_values) - } else { + if (is.null(new_col_name)) { if (inherits(slide_values, "data.frame")) { # unpack into separate columns (without name prefix) and, if there are # re-bindings, make the last one win for determining column value & @@ -313,6 +310,9 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = # apply default name: mutate(.data_group, slide_value = slide_values) } + } else { + # vector or packed data.frame-type column: + mutate(.data_group, !!new_col_name := slide_values) } return(result) From 7277b81c3170083a9e90c28846a44bc018be83a6 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 21 Aug 2024 13:48:04 -0700 Subject: [PATCH 039/110] tests: refactor a few slide tests (#516) * tests: refactor a few slide test --- R/slide.R | 16 +- R/utils.R | 36 +- tests/testthat/test-epi_slide.R | 789 ++++++++++---------------------- 3 files changed, 276 insertions(+), 565 deletions(-) diff --git a/R/slide.R b/R/slide.R index 6f0f4769..3901c34d 100644 --- a/R/slide.R +++ b/R/slide.R @@ -100,11 +100,15 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = assert_numeric(ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) if (!test_subset(ref_time_values, unique(x$time_value))) { cli_abort( - "`ref_time_values` must be a unique subset of the time values in `x`." + "`ref_time_values` must be a unique subset of the time values in `x`.", + class = "epi_slide__invalid_ref_time_values" ) } if (anyDuplicated(ref_time_values) != 0L) { - cli_abort("`ref_time_values` must not contain any duplicates; use `unique` if appropriate.") + cli_abort( + "`ref_time_values` must not contain any duplicates; use `unique` if appropriate.", + class = "epi_slide__invalid_ref_time_values" + ) } } ref_time_values <- sort(ref_time_values) @@ -495,11 +499,15 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref assert_numeric(ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) if (!test_subset(ref_time_values, unique(x$time_value))) { cli_abort( - "`ref_time_values` must be a unique subset of the time values in `x`." + "`ref_time_values` must be a unique subset of the time values in `x`.", + class = "epi_slide_opt__invalid_ref_time_values" ) } if (anyDuplicated(ref_time_values) != 0L) { - cli_abort("`ref_time_values` must not contain any duplicates; use `unique` if appropriate.") + cli_abort( + "`ref_time_values` must not contain any duplicates; use `unique` if appropriate.", + class = "epi_slide_opt__invalid_ref_time_values" + ) } } ref_time_values <- sort(ref_time_values) diff --git a/R/utils.R b/R/utils.R index dd3d4fca..ca6d53b4 100644 --- a/R/utils.R +++ b/R/utils.R @@ -878,37 +878,55 @@ guess_period.POSIXt <- function(time_values, time_values_arg = rlang::caller_arg validate_slide_window_arg <- function(arg, time_type, arg_name = rlang::caller_arg(arg)) { if (is.null(arg)) { - cli_abort("`{arg_name}` is a required argument.") + cli_abort("`{arg_name}` is a required argument.", class = "epiprocess__validate_slide_window_arg") } if (!checkmate::test_scalar(arg)) { - cli_abort("Expected `{arg_name}` to be a scalar value.") + cli_abort("Expected `{arg_name}` to be a scalar value.", class = "epiprocess__validate_slide_window_arg") } if (time_type == "custom") { - cli_abort("Unsure how to interpret slide units with a custom time type. Consider converting your time - column to a Date, yearmonth, or integer type.") + cli_abort( + "Unsure how to interpret slide units with a custom time type. Consider converting your time + column to a Date, yearmonth, or integer type.", + class = "epiprocess__validate_slide_window_arg" + ) } if (!identical(arg, Inf)) { if (time_type == "day") { if (!test_int(arg, lower = 0L) && !(inherits(arg, "difftime") && units(arg) == "days")) { - cli_abort("Expected `{arg_name}` to be a difftime with units in days or a non-negative integer.") + cli_abort( + "Expected `{arg_name}` to be a difftime with units in days or a non-negative integer.", + class = "epiprocess__validate_slide_window_arg" + ) } } else if (time_type == "week") { if (!(inherits(arg, "difftime") && units(arg) == "weeks")) { - cli_abort("Expected `{arg_name}` to be a difftime with units in weeks.") + cli_abort( + "Expected `{arg_name}` to be a difftime with units in weeks.", + class = "epiprocess__validate_slide_window_arg" + ) } } else if (time_type == "yearmonth") { if (!test_int(arg, lower = 0L) || inherits(arg, "difftime")) { - cli_abort("Expected `{arg_name}` to be a non-negative integer.") + cli_abort( + "Expected `{arg_name}` to be a non-negative integer.", + class = "epiprocess__validate_slide_window_arg" + ) } } else if (time_type == "integer") { if (!test_int(arg, lower = 0L) || inherits(arg, "difftime")) { - cli_abort("Expected `{arg_name}` to be a non-negative integer.") + cli_abort( + "Expected `{arg_name}` to be a non-negative integer.", + class = "epiprocess__validate_slide_window_arg" + ) } } else { - cli_abort("Expected `{arg_name}` to be Inf, an appropriate a difftime, or a non-negative integer.") + cli_abort( + "Expected `{arg_name}` to be Inf, an appropriate a difftime, or a non-negative integer.", + class = "epiprocess__validate_slide_window_arg" + ) } } } diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 4b53060d..f95b940a 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -1,5 +1,4 @@ -## Create an epi. df and a function to test epi_slide with - +# Create an epi_df and a function to test epi_slide with test_date <- as.Date("2020-01-01") days_dt <- as.difftime(1, units = "days") weeks_dt <- as.difftime(1, units = "weeks") @@ -48,211 +47,59 @@ basic_mean_result <- tibble::tribble( as_epi_df(as_of = test_date + 100) # nolint end: line_length_linter. -## --- These cases generate errors (or not): --- -test_that("`before` and `after` are both vectors of length 1", { - expect_error( - epi_slide(grouped, f, before = c(0, 1), after = 0, ref_time_values = test_date + 3), - "Expected `before` to be a scalar value." - ) - expect_error( - epi_slide(grouped, f, before = 1, after = c(0, 1), ref_time_values = test_date + 3), - "Expected `after` to be a scalar value." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, before = c(0, 1), after = 0, ref_time_values = test_date + 3), - "Expected `before` to be a scalar value." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, before = 1, after = c(0, 1), ref_time_values = test_date + 3), - "Expected `after` to be a scalar value." - ) -}) - -test_that("Test errors/warnings for discouraged features", { - expect_error( - epi_slide(grouped, f, ref_time_values = test_date + 1), - "`before` is a required argument." - ) - - expect_error( - epi_slide_mean(grouped, col_names = value, ref_time_values = test_date + 1), - "`before` is a required argument." - ) - - expect_no_warning( - ref1 <- epi_slide(grouped, f, before = days_dt, ref_time_values = test_date + 2) - ) - expect_no_warning( - ref2 <- epi_slide(grouped, f, after = days_dt, ref_time_values = test_date + 2) - ) - expect_no_warning( - opt1 <- epi_slide_mean(grouped, - col_names = value, - before = days_dt, ref_time_values = test_date + 2, na.rm = TRUE +# Argument validation tests +bad_values <- list( + "a", 0.5, -1L, -1.5, 1.5, NA, c(0, 1) +) +purrr::map(bad_values, function(bad_value) { + test_that("`before` and `after` in epi_slide fail on {x}", { + expect_error( + epi_slide(grouped, before = bad_value, ref_time_values = test_date + 2), + class = "epiprocess__validate_slide_window_arg" ) - ) - expect_no_warning( - opt2 <- epi_slide_mean(grouped, - col_names = value, - after = days_dt, ref_time_values = test_date + 2, na.rm = TRUE + expect_error( + epi_slide(grouped, after = bad_value, ref_time_values = test_date + 2), + class = "epiprocess__validate_slide_window_arg" ) - ) - - # Results from epi_slide and epi_slide_mean should match - expect_equal(select(ref1, -count), opt1 %>% rename(avg = slide_value_value)) - expect_equal(select(ref2, -count), opt2 %>% rename(avg = slide_value_value)) -}) - -test_that("Both `before` and `after` must be non-NA, non-negative, integer-compatible", { - expect_error( - epi_slide(grouped, f, before = -1L, ref_time_values = test_date + 2L), - "Expected `before` to be a difftime with units in days or a non-negative integer." - ) - expect_error( - epi_slide(grouped, f, after = -1L, ref_time_values = test_date + 2L), - "Expected `after` to be a difftime with units in days or a non-negative integer." - ) - expect_error(epi_slide(grouped, f, before = "a", after = days_dt, ref_time_values = test_date + 2L), - regexp = "Expected `before` to be a difftime with units in days or a non-negative integer." - ) - expect_error(epi_slide(grouped, f, before = days_dt, after = "a", ref_time_values = test_date + 2L), - regexp = "Expected `after` to be a difftime with units in days or a non-negative integer." - ) - expect_error(epi_slide(grouped, f, before = 0.5, after = days_dt, ref_time_values = test_date + 2L), - regexp = "Expected `before` to be a difftime with units in days or a non-negative integer." - ) - expect_error(epi_slide(grouped, f, before = days_dt, after = 0.5, ref_time_values = test_date + 2L), - regexp = "Expected `after` to be a difftime with units in days or a non-negative integer." - ) - expect_error( - epi_slide(grouped, f, before = NA, after = 1L, ref_time_values = test_date + 2L), - "Expected `before` to be a scalar value." - ) - expect_error( - epi_slide(grouped, f, before = days_dt, after = NA, ref_time_values = test_date + 2L), - "Expected `after` to be a scalar value." - ) - - expect_error( - epi_slide_mean(grouped, col_names = value, before = -1L, ref_time_values = test_date + 2L), - "Expected `before` to be a difftime with units in days or a non-negative integer." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, after = -1L, ref_time_values = test_date + 2L), - "Expected `after` to be a difftime with units in days or a non-negative integer." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, before = "a", ref_time_values = test_date + 2L), - regexp = "Expected `before` to be a difftime with units in days or a non-negative integer." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, after = "a", ref_time_values = test_date + 2L), - regexp = "Expected `after` to be a difftime with units in days or a non-negative integer." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, before = 0.5, ref_time_values = test_date + 2L), - regexp = "Expected `before` to be a difftime with units in days or a non-negative integer." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, after = 0.5, ref_time_values = test_date + 2L), - regexp = "Expected `after` to be a difftime with units in days or a non-negative integer." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, before = NA, after = days_dt, ref_time_values = test_date + 2L), - "Expected `before` to be a scalar value." - ) - expect_error( - epi_slide_mean(grouped, col_names = value, before = days_dt, after = NA, ref_time_values = test_date + 2L), - "Expected `after` to be a scalar value." - ) - - # Non-integer-class but integer-compatible values are allowed: - expect_no_error( - ref <- epi_slide(grouped, f, before = days_dt, after = days_dt, ref_time_values = test_date + 2L) - ) - expect_no_error(opt <- epi_slide_mean( - grouped, - col_names = value, before = days_dt, after = days_dt, - ref_time_values = test_date + 2L, na.rm = TRUE - )) - - # Results from epi_slide and epi_slide_mean should match - expect_equal(select(ref, -count), opt %>% rename(avg = slide_value_value)) + }) }) - -test_that("`ref_time_values` + `before` + `after` that result in no slide data, generate the error", { - expect_error( - epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = test_date), - "`ref_time_values` must be a unique subset of the time values in `x`." - ) # before the first, no data in the slide windows - expect_error( - epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = test_date + 207L), - "`ref_time_values` must be a unique subset of the time values in `x`." - ) # beyond the last, no data in window - - expect_error( - epi_slide_mean(grouped, col_names = value, before = 2 * days_dt, ref_time_values = test_date), - "`ref_time_values` must be a unique subset of the time values in `x`." - ) # before the first, no data in the slide windows - expect_error( - epi_slide_mean( - grouped, - col_names = value, - before = 2 * days_dt, - ref_time_values = test_date + 207L - ), - "`ref_time_values` must be a unique subset of the time values in `x`." - ) # beyond the last, no data in window -}) - -test_that( - c( - "`ref_time_values` + `before` + `after` that have some slide data, but - generate the error due to ref. time being out of time range (would - also happen if they were in between `time_value`s)" - ), - { +purrr::map(bad_values, function(bad_value) { + test_that("`before` and `after` in epi_slide_mean fail on {x}", { expect_error( - epi_slide(grouped, f, after = 2 * days_dt, ref_time_values = test_date), - "`ref_time_values` must be a unique subset of the time values in `x`." - ) # before the first, but we'd expect there to be data in the window + epi_slide_mean(grouped, col_names = value, before = bad_value, ref_time_values = test_date + 2), + class = "epiprocess__validate_slide_window_arg" + ) expect_error( - epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = test_date + 201L), - "`ref_time_values` must be a unique subset of the time values in `x`." - ) # beyond the last, but still with data in window + epi_slide_mean(grouped, col_names = value, after = bad_value, ref_time_values = test_date + 2), + class = "epiprocess__validate_slide_window_arg" + ) + }) +}) +bad_values <- c(min(grouped$time_value) - 1, max(grouped$time_value) + 1) +purrr::map(bad_values, function(bad_value) { + test_that("epi_slide or epi_slide_mean: `ref_time_values` out of range for all groups generate an error", { expect_error( - epi_slide_mean(grouped, value, after = 2 * days_dt, ref_time_values = test_date), - "`ref_time_values` must be a unique subset of the time values in `x`." - ) # before the first, but we'd expect there to be data in the window + epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = bad_value), + class = "epi_slide__invalid_ref_time_values" + ) expect_error( - epi_slide_mean(grouped, value, before = 2 * days_dt, ref_time_values = test_date + 201L), - "`ref_time_values` must be a unique subset of the time values in `x`." - ) # beyond the last, but still with data in window - } -) + epi_slide_mean(grouped, col_names = value, before = 2 * days_dt, ref_time_values = bad_value), + class = "epi_slide_opt__invalid_ref_time_values" + ) + }) +}) -## --- These cases doesn't generate the error: --- test_that( - c( - "these doesn't produce an error; the error appears only if the ref time - values are out of the range for every group" - ), + "epi_slide or epi_slide_mean: `ref_time_values` in range for at least one group generate no error", { expect_equal( epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = test_date + 200L) %>% ungroup() %>% dplyr::select("geo_value", "avg"), dplyr::tibble(geo_value = "ak", avg = 199) - ) # out of range for one group - expect_equal( - epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = test_date + 3) %>% - ungroup() %>% - dplyr::select("geo_value", "avg"), - dplyr::tibble(geo_value = c("ak", "al"), avg = c(2, -2)) - ) # not out of range for either group - + ) expect_equal( epi_slide_mean( grouped, value, @@ -261,34 +108,50 @@ test_that( ungroup() %>% dplyr::select("geo_value", "slide_value_value"), dplyr::tibble(geo_value = "ak", slide_value_value = 199) - ) # out of range for one group - expect_equal( - epi_slide_mean( - grouped, value, - before = 2 * days_dt, ref_time_values = test_date + 3, na.rm = TRUE - ) %>% - ungroup() %>% - dplyr::select("geo_value", "slide_value_value"), - dplyr::tibble(geo_value = c("ak", "al"), slide_value_value = c(2, -2)) - ) # not out of range for either group + ) } ) +test_that("epi_slide_mean errors when `as_list_col` non-NULL", { + expect_error( + toy_edf %>% + filter( + geo_value == "a" + ) %>% + epi_slide_mean( + value, + before = 6 * days_dt, as_list_col = TRUE, na.rm = TRUE + ), + class = "lifecycle_error_deprecated" + ) +}) + +test_that("epi_slide alerts if the provided f doesn't take enough args", { + f_xgt <- function(x, g, t) dplyr::tibble(value = mean(x$value), count = length(x$value)) + expect_no_error( + epi_slide(grouped, f_xgt, before = days_dt, ref_time_values = test_date + 1), + ) + expect_no_warning( + epi_slide(grouped, f_xgt, before = days_dt, ref_time_values = test_date + 1), + ) + + f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$value), count = length(x$value)) + expect_warning(epi_slide(grouped, f_x_dots, before = days_dt, ref_time_values = test_date + 1), + class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" + ) +}) + + +# Computation tests test_that("epi_slide outputs list columns when desired, and unpacks unnamed computations", { # See `toy_edf` and `basic_sum_result` definitions at top of file. - # We'll try 7d sum with a few formats. expect_equal( - toy_edf %>% - epi_slide(before = 6 * days_dt, ~ sum(.x$value)), + toy_edf %>% epi_slide(before = 6 * days_dt, ~ sum(.x$value)), basic_sum_result ) - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ list(sum(.x$value))), - basic_sum_result %>% dplyr::mutate(slide_value = as.list(slide_value)) - ) expect_equal( toy_edf %>% epi_slide(before = 6 * days_dt, ~ list(rep(sum(.x$value), 2L))), - basic_sum_result %>% dplyr::mutate(slide_value = lapply(slide_value, rep, 2L)) + basic_sum_result %>% mutate(slide_value = lapply(slide_value, rep, 2L)) ) expect_equal( toy_edf %>% epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value))), @@ -301,7 +164,7 @@ test_that("epi_slide outputs list columns when desired, and unpacks unnamed comp ) expect_identical( toy_edf %>% epi_slide(before = 6L, ~ tibble(slide_value = list(sum(.x$value)))), - basic_sum_result %>% mutate(across(slide_value, as.list)) + basic_sum_result %>% mutate(slide_value = as.list(slide_value)) ) # unnamed data-masking expression producing data frame: expect_identical( @@ -419,35 +282,6 @@ test_that("epi_slide can produce packed outputs", { ) }) -test_that("epi_slide_mean errors when `as_list_col` non-NULL", { - # See `toy_edf` and `basic_mean_result` definitions at top of file. - # We'll try 7d avg with a few formats. - # Warning: not exactly the same naming behavior as `epi_slide`. - expect_equal( - toy_edf %>% - filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, na.rm = TRUE - ), - basic_mean_result %>% rename(slide_value_value = slide_value) - ) - expect_error( - toy_edf %>% - filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, as_list_col = TRUE, na.rm = TRUE - ), - class = "lifecycle_error_deprecated" - ) - # `epi_slide_mean` doesn't return dataframe columns -}) - test_that("nested dataframe output names are controllable", { expect_equal( toy_edf %>% @@ -501,110 +335,36 @@ test_that("outputs are recycled", { ) }) -test_that("epi_slide alerts if the provided f doesn't take enough args", { - f_xgt <- function(x, g, t) dplyr::tibble(value = mean(x$value), count = length(x$value)) - # If `regexp` is NA, asserts that there should be no errors/messages. - expect_error( - epi_slide(grouped, f_xgt, before = days_dt, ref_time_values = test_date + 1), - regexp = NA - ) - expect_warning( - epi_slide(grouped, f_xgt, before = days_dt, ref_time_values = test_date + 1), - regexp = NA - ) - - f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$value), count = length(x$value)) - expect_warning(epi_slide(grouped, f_x_dots, before = days_dt, ref_time_values = test_date + 1), - class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" - ) -}) - test_that("`ref_time_values` + `all_rows = TRUE` works", { - # See `toy_edf` definition at top of file. We'll do variants of a slide - # returning the following: - # nolint start: line_length_linter. - basic_full_result <- tibble::tribble( - ~geo_value, ~time_value, ~value, ~slide_value, - "a", test_date + 1:10, 2L^(1:10), data.table::frollsum(2L^(1:10) + 2L^(11:20), c(1:7, rep(7L, 3L)), adaptive = TRUE, na.rm = TRUE), - "b", test_date + 1:10, 2L^(11:20), data.table::frollsum(2L^(1:10) + 2L^(11:20), c(1:7, rep(7L, 3L)), adaptive = TRUE, na.rm = TRUE), - ) %>% - tidyr::unchop(c(time_value, value, slide_value)) %>% - dplyr::arrange(time_value) %>% - as_epi_df(as_of = test_date + 100) - # nolint end - # slide computations returning atomic vecs: - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ sum(.x$value)), - basic_full_result - ) expect_equal( toy_edf %>% epi_slide( before = 6 * days_dt, ~ sum(.x$value), ref_time_values = test_date + c(2L, 8L) ), - basic_full_result %>% dplyr::filter(time_value %in% (test_date + c(2L, 8L))) + basic_sum_result %>% dplyr::filter(time_value %in% (test_date + c(2L, 8L))) ) expect_equal( toy_edf %>% epi_slide( before = 6 * days_dt, ~ sum(.x$value), ref_time_values = test_date + c(2L, 8L), all_rows = TRUE ), - basic_full_result %>% + basic_sum_result %>% dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), slide_value, NA_integer_ )) ) - expect_equal( - toy_edf %>% filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, na.rm = TRUE - ), - basic_mean_result %>% - rename(slide_value_value = slide_value) - ) - expect_equal( - toy_edf %>% filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, ref_time_values = test_date + c(2L, 8L), - na.rm = TRUE - ), - filter(basic_mean_result, time_value %in% (test_date + c(2L, 8L))) %>% - rename(slide_value_value = slide_value) - ) - expect_equal( - toy_edf %>% filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, ref_time_values = test_date + c(2L, 8L), all_rows = TRUE, - na.rm = TRUE - ), - basic_mean_result %>% - dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), - slide_value, NA_integer_ - )) %>% - rename(slide_value_value = slide_value) - ) - # slide computations returning data frames: expect_equal( toy_edf %>% epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value))), - basic_full_result + basic_sum_result ) expect_equal( toy_edf %>% epi_slide( before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value)), ref_time_values = test_date + c(2L, 8L) ), - basic_full_result %>% + basic_sum_result %>% dplyr::filter(time_value %in% (test_date + c(2L, 8L))) ) expect_equal( @@ -612,17 +372,18 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value)), ref_time_values = test_date + c(2L, 8L), all_rows = TRUE ), - basic_full_result %>% + basic_sum_result %>% dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), slide_value, NA_integer_ )) ) + # slide computations returning data frames with `as_list_col=TRUE`: expect_equal( toy_edf %>% epi_slide( before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))) ), - basic_full_result %>% + basic_sum_result %>% dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) ) expect_equal( @@ -630,7 +391,7 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), ref_time_values = test_date + c(2L, 8L) ), - basic_full_result %>% + basic_sum_result %>% dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% dplyr::filter(time_value %in% (test_date + c(2L, 8L))) ) @@ -639,19 +400,20 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), ref_time_values = test_date + c(2L, 8L), all_rows = TRUE ), - basic_full_result %>% + basic_sum_result %>% dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), slide_value, list(NULL) )) ) + # slide computations returning data frames, `as_list_col = TRUE`, `unnest`: expect_equal( toy_edf %>% epi_slide( before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))) ) %>% unnest(slide_value), - basic_full_result + basic_sum_result ) expect_equal( toy_edf %>% epi_slide( @@ -659,7 +421,7 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { ref_time_values = test_date + c(2L, 8L) ) %>% unnest(slide_value), - basic_full_result %>% + basic_sum_result %>% dplyr::filter(time_value %in% (test_date + c(2L, 8L))) ) expect_equal( @@ -668,7 +430,7 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { ref_time_values = test_date + c(2L, 8L), all_rows = TRUE ) %>% unnest(slide_value), - basic_full_result %>% + basic_sum_result %>% # XXX unclear exactly what we want in this case. Current approach is # compatible with `vctrs::vec_detect_missing` but breaks `tidyr::unnest` # compatibility since the non-ref rows are dropped @@ -688,13 +450,54 @@ test_that("`ref_time_values` + `all_rows = TRUE` works", { ) %>% mutate(slide_value = rework_nulls(slide_value)) %>% unnest(slide_value), - basic_full_result %>% + basic_sum_result %>% dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), slide_value, NA_integer_ )) ) }) +test_that("epi_slide_mean works with ref_time_value and all_rows", { + expect_equal( + toy_edf %>% filter( + geo_value == "a" + ) %>% + epi_slide_mean( + value, + before = 6 * days_dt, na.rm = TRUE + ), + basic_mean_result %>% + rename(slide_value_value = slide_value) + ) + expect_equal( + toy_edf %>% filter( + geo_value == "a" + ) %>% + epi_slide_mean( + value, + before = 6 * days_dt, ref_time_values = test_date + c(2L, 8L), + na.rm = TRUE + ), + filter(basic_mean_result, time_value %in% (test_date + c(2L, 8L))) %>% + rename(slide_value_value = slide_value) + ) + expect_equal( + toy_edf %>% filter( + geo_value == "a" + ) %>% + epi_slide_mean( + value, + before = 6 * days_dt, ref_time_values = test_date + c(2L, 8L), all_rows = TRUE, + na.rm = TRUE + ), + basic_mean_result %>% + dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), + slide_value, NA_integer_ + )) %>% + rename(slide_value_value = slide_value) + ) +}) + test_that("`epi_slide` doesn't decay date output", { expect_true( ungrouped %>% @@ -1032,193 +835,89 @@ test_that("epi_slide gets correct ref_time_value when groups have non-overlappin expect_equal(result1, expected_output) }) -test_that("results for different `before`s and `after`s match between epi_slide and epi_slide_mean", { - test_time_type_mean <- function(dates, vals, before = 6 * days_dt, after = 0 * days_dt, n, m, n_obs, k, ...) { - # Three states, with 2 variables. a is linear, going up in one state and down in the other - # b is just random. last (m-1):(n-1) dates are missing - epi_data <- epiprocess::as_epi_df(rbind(tibble( - geo_value = "al", - time_value = dates, - a = 1:n_obs, - b = vals - ), tibble( - geo_value = "ca", - time_value = dates, - a = n_obs:1, - b = vals + 10 - ))) %>% - group_by(geo_value) - - # Use the `epi_slide` result as a reference. - result1 <- epi_slide(epi_data, ~ data.frame( - slide_value_a = mean(.x$a, rm.na = TRUE), - slide_value_b = mean(.x$b, rm.na = TRUE) - ), - before = before, after = after, ... - ) - result2 <- epi_slide_mean(epi_data, col_names = c(a, b), na.rm = TRUE, before = before, after = after, ...) - expect_equal(result1, result2) - } - - set.seed(0) - - # 3 missing dates - n <- 15 # Max date index - m <- 3 # Number of missing dates - n_obs <- n + 1 - m # Number of obs created - k <- c(0:(n - (m + 1)), n) # Date indices - - rand_vals <- rnorm(n_obs) - # Basic time type - days <- as.Date("2022-01-01") + k - - test_time_type_mean(days, rand_vals, before = 6 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, before = 6 * days_dt, after = 1 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, before = 6 * days_dt, after = 6 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, before = 1 * days_dt, after = 6 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, after = 6 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, after = 1 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - - # Without any missing dates - n <- 15 # Max date index - m <- 0 # Number of missing dates - n_obs <- n + 1 - m # Number of obs created - k <- c(0:(n - (m + 1)), n) # Date indices - - rand_vals <- rnorm(n_obs) - # Basic time type - days <- as.Date("2022-01-01") + k - - test_time_type_mean(days, rand_vals, before = 6 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, before = 6 * days_dt, after = 1 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, before = 6 * days_dt, after = 6 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, before = 1 * days_dt, after = 6 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, after = 6 * days_dt, n = n, m = m, n_obs = n_obs, k = k) - test_time_type_mean(days, rand_vals, after = 1 * days_dt, n = n, m = m, n_obs = n_obs, k = k) -}) - -test_that("results for different time_types match between epi_slide and epi_slide_mean", { - n <- 6L # Max date index - m <- 1L # Number of missing dates - n_obs <- n + 1L - m # Number of obs created - k <- c(0L:(n - (m + 1L)), n) # Date indices - - set.seed(0) - rand_vals <- rnorm(n_obs) - - generate_special_date_data <- function(date_seq, ...) { - epiprocess::as_epi_df(rbind(tibble( - geo_value = "al", - time_value = date_seq, - a = seq_along(date_seq), - b = rand_vals - ), tibble( - geo_value = "ca", - time_value = date_seq, - a = rev(seq_along(date_seq)), - b = rand_vals + 10 - ), tibble( - geo_value = "fl", - time_value = date_seq, - a = rev(seq_along(date_seq)), - b = rand_vals * 2 - )), ...) - } - - # Basic time type, require before and after in difftimes - days <- as.Date("2022-01-01") + k - weeks <- as.Date("2022-01-01") + 7L * k - yearmonths <- tsibble::yearmonth(10L + k) - integers <- 2000L + k - - ref_epi_data <- generate_special_date_data(days) %>% - group_by(geo_value) - - ref_result <- epi_slide(ref_epi_data, ~ data.frame( - slide_value_a = mean(.x$a, rm.na = TRUE), - slide_value_b = mean(.x$b, rm.na = TRUE) - ), - before = 6 * days_dt - ) - - test_time_type_mean <- function(dates, before) { - # Three states, with 2 variables. a is linear, going up in one state and down in the other - # b is just random. date 10 is missing - epi_data <- generate_special_date_data(dates) %>% +time_types <- c("days", "weeks", "yearmonths", "integers") +for (time_type in time_types) { + test_that("epi_slide and epi_slide_mean: different before/after match for {time_type}", { + set.seed(0) + n <- 16 + epi_data_no_missing <- rbind( + tibble(geo_value = "al", a = 1:n, b = rnorm(n)), + tibble(geo_value = "ca", a = n:1, b = rnorm(n) + 10), + tibble(geo_value = "fl", a = n:1, b = rnorm(n) * 2) + ) %>% + mutate( + time_value = rep( + switch(time_type, + days = as.Date("2022-01-01") + 1:n, + weeks = as.Date("2022-01-01") + 7L * 1:n, + yearmonths = tsibble::yearmonth(10L + 1:n), + integers = 2000L + 1:n, + ), 3 + ) + ) %>% + as_epi_df() %>% group_by(geo_value) + # Remove rows 12, 13, and 14 from every group + epi_data_missing <- epi_data_no_missing %>% slice(1:11, 15:16) - result1 <- epi_slide(epi_data, ~ data.frame( - slide_value_a = mean(.x$a, rm.na = TRUE), - slide_value_b = mean(.x$b, rm.na = TRUE) - ), - before = before - ) - result2 <- epi_slide_mean(epi_data, - col_names = c(a, b), na.rm = TRUE, before = before + test_time_type_mean <- function(epi_data, before = NULL, after = NULL, ...) { + result1 <- epi_slide(epi_data, ~ data.frame( + slide_value_a = mean(.x$a, rm.na = TRUE), + slide_value_b = mean(.x$b, rm.na = TRUE) + ), + before = before, after = after, ... + ) + result2 <- epi_slide_mean(epi_data, col_names = c(a, b), na.rm = TRUE, before = before, after = after, ...) + expect_equal(result1, result2) + } + + units <- switch(time_type, + days = days_dt, + weeks = weeks_dt, + yearmonths = 1, + integers = 1 ) - expect_equal(result1, result2) - - # All fields except dates - expect_equal(select(ref_result, -time_value), select(result1, -time_value)) - expect_equal(select(ref_result, -time_value), select(result2, -time_value)) - } - test_time_type_mean(days, before = 6 * days_dt) - test_time_type_mean(weeks, before = 6 * weeks_dt) - test_time_type_mean(yearmonths, before = 6) - test_time_type_mean(integers, before = 6) - - # `epi_slide_mean` can also handle `weeks` without `time_step` being - # provided, but `epi_slide` can't - epi_data <- generate_special_date_data(weeks) %>% - group_by(geo_value) - result2 <- epi_slide_mean(epi_data, - col_names = c(a, b), na.rm = TRUE, - before = 6 * weeks_dt - ) - expect_equal(select(ref_result, -time_value), select(result2, -time_value)) -}) + test_time_type_mean(epi_data_missing, before = 6 * units) + test_time_type_mean(epi_data_missing, before = 6 * units, after = 1 * units) + test_time_type_mean(epi_data_missing, before = 6 * units, after = 6 * units) + test_time_type_mean(epi_data_missing, before = 1 * units, after = 6 * units) + test_time_type_mean(epi_data_missing, after = 6 * units) + test_time_type_mean(epi_data_missing, after = 1 * units) + + test_time_type_mean(epi_data_no_missing, before = 6 * units) + test_time_type_mean(epi_data_no_missing, before = 6 * units, after = 1 * units) + test_time_type_mean(epi_data_no_missing, before = 6 * units, after = 6 * units) + test_time_type_mean(epi_data_no_missing, before = 1 * units, after = 6 * units) + test_time_type_mean(epi_data_no_missing, after = 6 * units) + test_time_type_mean(epi_data_no_missing, after = 1 * units) + }) +} test_that("helper `full_date_seq` returns expected date values", { - n <- 6L # Max date index - m <- 1L # Number of missing dates - n_obs <- n + 1L - m # Number of obs created - k <- c(0L:(n - (m + 1L)), n) # Date indices - set.seed(0) - rand_vals <- rnorm(n_obs) - - generate_special_date_data <- function(date_seq, ...) { - epiprocess::as_epi_df(rbind(tibble( - geo_value = "al", - time_value = date_seq, - a = seq_along(date_seq), - b = rand_vals - ), tibble( - geo_value = "ca", - time_value = date_seq, - a = rev(seq_along(date_seq)), - b = rand_vals + 10 - ), tibble( - geo_value = "fl", - time_value = date_seq, - a = rev(seq_along(date_seq)), - b = rand_vals * 2 - )), ...) - } - - # Basic time type, require before and after in difftimes - days <- as.Date("2022-01-01") + k - weeks <- as.Date("2022-01-01") + 7L * k - yearmonths <- tsibble::yearmonth(10L + k) - integers <- 2000L + k + n <- 7 + epi_data_missing <- rbind( + tibble(geo_value = "al", a = 1:n, b = rnorm(n)), + tibble(geo_value = "ca", a = n:1, b = rnorm(n) + 10), + tibble(geo_value = "fl", a = n:1, b = rnorm(n) * 2) + ) %>% + mutate( + days = rep(as.Date("2022-01-01") - 1 + 1:n, 3), + weeks = rep(as.Date("2022-01-01") - 7 + 7L * 1:n, 3), + yearmonths = rep(tsibble::yearmonth(10L - 1 + 1:n), 3), + integers = rep(2000L - 1 + 1:n, 3) + ) %>% + slice(1:4, 6:7) before <- 2L after <- 1L expect_identical( full_date_seq( - generate_special_date_data(days), + epi_data_missing %>% mutate(time_value = days) %>% + as_epi_df() %>% + group_by(geo_value), before = before * days_dt, after = after * days_dt, time_type = "day" ), list( @@ -1231,7 +930,12 @@ test_that("helper `full_date_seq` returns expected date values", { ) ) expect_identical( - full_date_seq(generate_special_date_data(weeks), before = before, after = after, time_type = "week"), + full_date_seq( + epi_data_missing %>% mutate(time_value = weeks) %>% + as_epi_df() %>% + group_by(geo_value), + before = before, after = after, time_type = "week" + ), list( all_dates = as.Date(c( "2022-01-01", "2022-01-08", "2022-01-15", "2022-01-22", @@ -1242,7 +946,12 @@ test_that("helper `full_date_seq` returns expected date values", { ) ) expect_identical( - full_date_seq(generate_special_date_data(yearmonths), before = before, after = after, time_type = "yearmonth"), + full_date_seq( + epi_data_missing %>% mutate(time_value = yearmonths) %>% + as_epi_df() %>% + group_by(geo_value), + before = before, after = after, time_type = "yearmonth" + ), list( all_dates = tsibble::yearmonth(10:16), pad_early_dates = tsibble::yearmonth(8:9), @@ -1250,11 +959,16 @@ test_that("helper `full_date_seq` returns expected date values", { ) ) expect_identical( - full_date_seq(generate_special_date_data(integers), before = before, after = after, time_type = "integer"), + full_date_seq( + epi_data_missing %>% mutate(time_value = integers) %>% + as_epi_df() %>% + group_by(geo_value), + before = before, after = after, time_type = "integer" + ), list( - all_dates = 2000L:2006L, - pad_early_dates = 1998L:1999L, - pad_late_dates = 2007L + all_dates = as.double(2000:2006), + pad_early_dates = as.double(1998:1999), + pad_late_dates = 2007 ) ) @@ -1264,7 +978,9 @@ test_that("helper `full_date_seq` returns expected date values", { expect_identical( full_date_seq( - generate_special_date_data(days), + epi_data_missing %>% mutate(time_value = days) %>% + as_epi_df() %>% + group_by(geo_value), before = before * days_dt, after = after * days_dt, time_type = "day" ), list( @@ -1285,7 +1001,9 @@ test_that("helper `full_date_seq` returns expected date values", { expect_identical( full_date_seq( - generate_special_date_data(days), + epi_data_missing %>% mutate(time_value = days) %>% + as_epi_df() %>% + group_by(geo_value), before = before * days_dt, after = after * days_dt, time_type = "day" ), list( @@ -1301,59 +1019,26 @@ test_that("helper `full_date_seq` returns expected date values", { ) }) -test_that("epi_slide_mean produces same output as epi_slide_opt", { - result1 <- epi_slide_mean(small_x, value, before = 50 * days_dt, na.rm = TRUE) - result2 <- epi_slide_opt(small_x, value, - f = data.table::frollmean, - before = 50 * days_dt, na.rm = TRUE - ) - result2 <- epi_slide_opt( - small_x, - value, - f = data.table::frollmean, - before = 50 * days_dt, - na.rm = TRUE +test_that("epi_slide_mean/sum produces same output as epi_slide_opt", { + expect_equal( + epi_slide_mean(small_x, value, before = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(small_x, value, f = data.table::frollmean, before = 50 * days_dt, na.rm = TRUE) ) - expect_equal(result1, result2) - result3 <- epi_slide_opt( - small_x, - value, - f = slider::slide_mean, - before = 50 * days_dt, - na_rm = TRUE + expect_equal( + epi_slide_mean(small_x, value, before = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(small_x, value, f = slider::slide_mean, before = 50 * days_dt, na_rm = TRUE) ) - expect_equal(result1, result3) -}) - -test_that("epi_slide_sum produces same output as epi_slide_opt", { - result1 <- epi_slide_sum(small_x, value, before = 50 * days_dt, na.rm = TRUE) - result2 <- epi_slide_opt(small_x, value, - f = data.table::frollsum, - before = 50 * days_dt, na.rm = TRUE + expect_equal( + epi_slide_sum(small_x, value, before = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(small_x, value, f = data.table::frollsum, before = 50 * days_dt, na.rm = TRUE) ) - expect_equal(result1, result2) - result3 <- epi_slide_opt(small_x, value, - f = slider::slide_sum, - before = 50 * days_dt, na_rm = TRUE + expect_equal( + epi_slide_sum(small_x, value, before = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(small_x, value, f = slider::slide_sum, before = 50 * days_dt, na_rm = TRUE) ) - expect_equal(result1, result3) }) test_that("`epi_slide_opt` errors when passed non-`data.table`, non-`slider` functions", { - expect_no_error( - epi_slide_opt( - grouped, - col_names = value, f = data.table::frollmean, - before = days_dt, ref_time_values = test_date + 1 - ) - ) - expect_no_error( - epi_slide_opt( - grouped, - col_names = value, f = slider::slide_min, - before = days_dt, ref_time_values = test_date + 1 - ) - ) reexport_frollmean <- data.table::frollmean expect_no_error( epi_slide_opt( From 4fe94dafb5e5d834cc6493f92a5347f9510fb5ab Mon Sep 17 00:00:00 2001 From: dshemetov Date: Wed, 21 Aug 2024 20:57:59 +0000 Subject: [PATCH 040/110] docs: document (GHA) --- man/as_tibble.epi_df.Rd | 2 +- man/epi_slide_mean.Rd | 9 +-------- man/epi_slide_opt.Rd | 9 +-------- man/epi_slide_sum.Rd | 9 +-------- man/epiprocess.Rd | 2 +- 5 files changed, 5 insertions(+), 26 deletions(-) diff --git a/man/as_tibble.epi_df.Rd b/man/as_tibble.epi_df.Rd index 9d016cd6..bf61676a 100644 --- a/man/as_tibble.epi_df.Rd +++ b/man/as_tibble.epi_df.Rd @@ -9,7 +9,7 @@ \arguments{ \item{x}{an \code{epi_df}} -\item{...}{Unused, for extensibility.} +\item{...}{forwarded to \code{as_tibble} for \code{data.frame}s} } \description{ Converts an \code{epi_df} object into a tibble, dropping metadata and any diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index 468de793..8eaeecce 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -71,10 +71,6 @@ underlying data table, by default.} \item{new_col_name}{Not supported. Included to match \code{epi_slide} interface.} -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} - \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in the output even with \code{ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s @@ -88,10 +84,7 @@ operations, you might want to replace these \code{NULL} entries with a different \item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} -\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying -\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL -value, you can either directly prefix your slide computation names, or -output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} +\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} } \value{ An \code{epi_df} object given by appending one or more new columns to \code{x}, diff --git a/man/epi_slide_opt.Rd b/man/epi_slide_opt.Rd index f3b16a1f..83058d00 100644 --- a/man/epi_slide_opt.Rd +++ b/man/epi_slide_opt.Rd @@ -92,10 +92,6 @@ underlying data table, by default.} \item{new_col_name}{Not supported. Included to match \code{epi_slide} interface.} -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} - \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in the output even with \code{ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s @@ -109,10 +105,7 @@ operations, you might want to replace these \code{NULL} entries with a different \item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} -\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying -\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL -value, you can either directly prefix your slide computation names, or -output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} +\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} } \value{ An \code{epi_df} object given by appending one or more new columns to \code{x}, diff --git a/man/epi_slide_sum.Rd b/man/epi_slide_sum.Rd index 41ad6851..a9be858f 100644 --- a/man/epi_slide_sum.Rd +++ b/man/epi_slide_sum.Rd @@ -71,10 +71,6 @@ underlying data table, by default.} \item{new_col_name}{Not supported. Included to match \code{epi_slide} interface.} -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} - \item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in the output even with \code{ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s @@ -88,10 +84,7 @@ operations, you might want to replace these \code{NULL} entries with a different \item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} -\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying -\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL -value, you can either directly prefix your slide computation names, or -output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} +\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} } \value{ An \code{epi_df} object given by appending one or more new columns to \code{x}, diff --git a/man/epiprocess.Rd b/man/epiprocess.Rd index a3e98366..f6345cbe 100644 --- a/man/epiprocess.Rd +++ b/man/epiprocess.Rd @@ -2,8 +2,8 @@ % Please edit documentation in R/epiprocess.R \docType{package} \name{epiprocess} -\alias{epiprocess} \alias{epiprocess-package} +\alias{epiprocess} \title{epiprocess: Tools for basic signal processing in epidemiology} \description{ This package introduces a common data structure for epidemiological data sets From 6b7944e3c5b2ae03eb9a504ad3681870b6949561 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 21 Aug 2024 14:57:38 -0700 Subject: [PATCH 041/110] tests: enable parallel tests --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 856cd727..f78076c3 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -62,6 +62,7 @@ Remotes: reconverse/outbreaks, glmgen/genlasso Config/testthat/edition: 3 +Config/testthat/parallel: true Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) From 6a70274983409b0421f03294194199b7e402d0a9 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 21 Aug 2024 14:57:59 -0700 Subject: [PATCH 042/110] tests: fix a few tests --- R/slide.R | 10 +-- tests/testthat/test-epi_slide.R | 117 ++++++++++++++++++++------------ 2 files changed, 78 insertions(+), 49 deletions(-) diff --git a/R/slide.R b/R/slide.R index 70670884..c27d7cea 100644 --- a/R/slide.R +++ b/R/slide.R @@ -126,7 +126,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = if (inherits(before, "difftime")) { after <- as.difftime(0, units = units(before)) } else { - if (before == Inf && time_type %in% c("day", "week")) { + if (identical(before, Inf) && time_type %in% c("day", "week")) { after <- as.difftime(0, units = glue::glue("{time_type}s")) } else { after <- 0 @@ -435,7 +435,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' ungroup() epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref_time_values = NULL, new_col_name = NULL, all_rows = FALSE, - as_list_col = deprecated(), names_sep = deprecated()) { + as_list_col = deprecated(), names_sep = NULL) { assert_class(x, "epi_df") if (nrow(x) == 0L) { @@ -540,7 +540,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref if (inherits(before, "difftime")) { after <- as.difftime(0, units = units(before)) } else { - if (before == Inf && time_type %in% c("day", "week")) { + if (identical(before, Inf) && time_type %in% c("day", "week")) { after <- as.difftime(0, units = glue::glue("{time_type}s")) } else { after <- 0 @@ -736,7 +736,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' ungroup() epi_slide_mean <- function(x, col_names, ..., before = NULL, after = NULL, ref_time_values = NULL, new_col_name = NULL, all_rows = FALSE, - as_list_col = deprecated(), names_sep = deprecated()) { + as_list_col = deprecated(), names_sep = NULL) { epi_slide_opt( x = x, col_names = {{ col_names }}, @@ -783,7 +783,7 @@ epi_slide_sum <- function(x, col_names, ..., before = NULL, after = NULL, ref_ti new_col_name = NULL, all_rows = FALSE, as_list_col = deprecated(), - names_sep = deprecated()) { + names_sep = NULL) { epi_slide_opt( x = x, col_names = {{ col_names }}, diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index f106bd33..34cb0988 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -1,3 +1,5 @@ +library(cli) + # Create an epi_df and a function to test epi_slide with test_date <- as.Date("2020-01-01") days_dt <- as.difftime(1, units = "days") @@ -53,19 +55,22 @@ bad_values <- list( "a", 0.5, -1L, -1.5, 1.5, NA, c(0, 1) ) purrr::map(bad_values, function(bad_value) { - test_that("`before` and `after` in epi_slide fail on {x}", { - expect_error( - epi_slide(grouped, before = bad_value, ref_time_values = test_date + 2), - class = "epiprocess__validate_slide_window_arg" - ) - expect_error( - epi_slide(grouped, after = bad_value, ref_time_values = test_date + 2), - class = "epiprocess__validate_slide_window_arg" - ) - }) + test_that( + format_inline("`before` and `after` in epi_slide fail on {bad_value}"), + { + expect_error( + epi_slide(grouped, before = bad_value, ref_time_values = test_date + 2), + class = "epiprocess__validate_slide_window_arg" + ) + expect_error( + epi_slide(grouped, after = bad_value, ref_time_values = test_date + 2), + class = "epiprocess__validate_slide_window_arg" + ) + } + ) }) purrr::map(bad_values, function(bad_value) { - test_that("`before` and `after` in epi_slide_mean fail on {x}", { + test_that(format_inline("`before` and `after` in epi_slide_mean fail on {bad_value}"), { expect_error( epi_slide_mean(grouped, col_names = value, before = bad_value, ref_time_values = test_date + 2), class = "epiprocess__validate_slide_window_arg" @@ -79,7 +84,7 @@ purrr::map(bad_values, function(bad_value) { bad_values <- c(min(grouped$time_value) - 1, max(grouped$time_value) + 1) purrr::map(bad_values, function(bad_value) { - test_that("epi_slide or epi_slide_mean: `ref_time_values` out of range for all groups generate an error", { + test_that(format_inline("epi_slide[_mean]: `ref_time_values` out of range for all groups {bad_value}"), { expect_error( epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = bad_value), class = "epi_slide__invalid_ref_time_values" @@ -142,38 +147,62 @@ test_that("epi_slide alerts if the provided f doesn't take enough args", { }) -# Computation tests -test_that("epi_slide outputs list columns when desired, and unpacks unnamed computations", { - # See `toy_edf` and `basic_sum_result` definitions at top of file. - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ sum(.x$value)), - basic_sum_result - ) - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ list(rep(sum(.x$value), 2L))), - basic_sum_result %>% mutate(slide_value = lapply(slide_value, rep, 2L)) - ) - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value))), - basic_sum_result - ) - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value)))), - basic_sum_result %>% - mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) - ) - expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ tibble(slide_value = list(sum(.x$value)))), - basic_sum_result %>% mutate(slide_value = as.list(slide_value)) - ) - # unnamed data-masking expression producing data frame: - expect_identical( - # unfortunately, we can't pass this directly as `f` and need an extra comma - toy_edf %>% epi_slide(before = 6L, , data.frame(slide_value = sum(.x$value))), - basic_sum_result - ) -}) +# Common example tests +for (rtv in list(NULL, test_date + 1, c(test_date + 1, test_date + 3))) { + test_that(format_inline("epi_slide works with formulas, lists, and data.frame outputs with ref_time_value {rtv}"), { + expect_equal( + toy_edf %>% epi_slide(before = 6 * days_dt, ~ sum(.x$value), ref_time_values = rtv), + basic_sum_result %>% + { + if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + } + ) + expect_equal( + toy_edf %>% epi_slide(before = 6 * days_dt, ~ list(rep(sum(.x$value), 2L)), ref_time_values = rtv), + basic_sum_result %>% mutate(slide_value = lapply(slide_value, rep, 2L)) %>% + { + if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + } + ) + expect_equal( + toy_edf %>% epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value)), ref_time_values = rtv), + basic_sum_result %>% + { + if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + } + ) + expect_equal( + toy_edf %>% epi_slide( + before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), + ref_time_values = rtv + ), + basic_sum_result %>% + mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% + { + if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + } + ) + expect_identical( + toy_edf %>% epi_slide(before = 6L, ~ tibble(slide_value = list(sum(.x$value))), ref_time_values = rtv), + basic_sum_result %>% mutate(slide_value = as.list(slide_value)) %>% + { + if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + } + ) + # unnamed data-masking expression producing data frame: + expect_identical( + # unfortunately, we can't pass this directly as `f` and need an extra comma + toy_edf %>% epi_slide(before = 6L, , data.frame(slide_value = sum(.x$value)), ref_time_values = rtv), + basic_sum_result %>% + { + if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + } + ) + }) +} + +# Edge example tests test_that("epi_slide can use sequential data masking expressions including NULL", { edf_a <- tibble::tibble( geo_value = 1, @@ -837,7 +866,7 @@ test_that("epi_slide gets correct ref_time_value when groups have non-overlappin time_types <- c("days", "weeks", "yearmonths", "integers") for (time_type in time_types) { - test_that("epi_slide and epi_slide_mean: different before/after match for {time_type}", { + test_that(format_inline("epi_slide and epi_slide_mean: different before/after match for {time_type}"), { set.seed(0) n <- 16 epi_data_no_missing <- rbind( From 902bf614dce46758789817257d1394b204562077 Mon Sep 17 00:00:00 2001 From: dshemetov Date: Wed, 21 Aug 2024 21:59:44 +0000 Subject: [PATCH 043/110] docs: document (GHA) --- man/epi_slide_mean.Rd | 2 +- man/epi_slide_opt.Rd | 2 +- man/epi_slide_sum.Rd | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index 8eaeecce..55acad3c 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -14,7 +14,7 @@ epi_slide_mean( new_col_name = NULL, all_rows = FALSE, as_list_col = deprecated(), - names_sep = deprecated() + names_sep = NULL ) } \arguments{ diff --git a/man/epi_slide_opt.Rd b/man/epi_slide_opt.Rd index 83058d00..f0442d1e 100644 --- a/man/epi_slide_opt.Rd +++ b/man/epi_slide_opt.Rd @@ -15,7 +15,7 @@ epi_slide_opt( new_col_name = NULL, all_rows = FALSE, as_list_col = deprecated(), - names_sep = deprecated() + names_sep = NULL ) } \arguments{ diff --git a/man/epi_slide_sum.Rd b/man/epi_slide_sum.Rd index a9be858f..8e79474a 100644 --- a/man/epi_slide_sum.Rd +++ b/man/epi_slide_sum.Rd @@ -14,7 +14,7 @@ epi_slide_sum( new_col_name = NULL, all_rows = FALSE, as_list_col = deprecated(), - names_sep = deprecated() + names_sep = NULL ) } \arguments{ From 0faa438570681519f78e38e590369e3a7a344051 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 21 Aug 2024 16:31:25 -0700 Subject: [PATCH 044/110] Fix misfiled NEWS.md entry, combine two breaking changes sections --- NEWS.md | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/NEWS.md b/NEWS.md index bc2627ea..5b231126 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,18 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat # epiprocess 0.9 +## Breaking changes +- In `epi[x]_slide`: + - `names_sep` is deprecated, and if you return data frames from your + computations, they will no longer be unpacked into separate columns with + name prefixes; instead: + - if you don't provide a name for your slide computations, they will be + unpacked into separate columns, just without any name prefixes + - if you do provide a name for your slide computation, it will become a + packed data.frame-class column (see `tidyr::pack`). + - `as_list_col` is deprecated; you can now directly return a list from your + slide computations instead. + ## Improvements - Added `complete.epi_df`, which fills in missing values in an `epi_df` with @@ -21,16 +33,14 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat ## Breaking changes -- In `epi[x]_slide`: - - `names_sep` is deprecated, and if you return data frames from your - computations, they will no longer be unpacked into separate columns with - name prefixes; instead: - - if you don't provide a name for your slide computations, they will be - unpacked into separate columns, just without any name prefixes - - if you do provide a name for your slide computation, it will become a - packed data.frame-class column (see `tidyr::pack`). - - `as_list_col` is deprecated; you can now directly return a list from your - slide computations instead. +- `epi_df`'s are now more strict about what types they allow in the time column. + Namely, we are explicit about only supporting `Date` at the daily and weekly + cadence and generic integer types (for yearly cadence). +- `epi_slide` `before` and `after` arguments are now require the user to + specific time units in certain cases. The `time_step` argument has been + removed. +- `epix_slide` `before` argument now defaults to `Inf`, and requires the user to + specify units in some cases. The `time_step` argument has been removed. - `detect_outlr_stl(seasonal_period = NULL)` is no longer accepted. Use `detect_outlr_stl(seasonal_period = , seasonal_as_residual = TRUE)` instead. See `?detect_outlr_stl` for more details. @@ -87,17 +97,6 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat of `epi_df`s to let `{epipredict}` work more easily with other libraries (#471). - Removed some external package dependencies. -## Breaking Changes - -- `epi_df`'s are now more strict about what types they allow in the time column. - Namely, we are explicit about only supporting `Date` at the daily and weekly - cadence and generic integer types (for yearly cadence). -- `epi_slide` `before` and `after` arguments are now require the user to - specific time units in certain cases. The `time_step` argument has been - removed. -- `epix_slide` `before` argument now defaults to `Inf`, and requires the user to - specify units in some cases. The `time_step` argument has been removed. - # epiprocess 0.7.0 ## Breaking changes: From d88ec2d01a6eb2c6a76c96c13d5d7654e14ec932 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 21 Aug 2024 17:41:41 -0700 Subject: [PATCH 045/110] tests: even more slide test consolidation --- tests/testthat/test-epi_slide.R | 833 +++++++++++++------------------- 1 file changed, 336 insertions(+), 497 deletions(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 34cb0988..4ccb5aea 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -30,31 +30,43 @@ toy_edf <- tibble::tribble( tidyr::unchop(c(time_value, value)) %>% as_epi_df(as_of = test_date + 100) -# nolint start: line_length_linter. -basic_sum_result <- tibble::tribble( - ~geo_value, ~time_value, ~value, ~slide_value, - "a", test_date + 1:10, 2L^(1:10), data.table::frollsum(2L^(1:10) + 2L^(11:20), c(1:7, rep(7L, 3L)), adaptive = TRUE, na.rm = TRUE), - "b", test_date + 1:10, 2L^(11:20), data.table::frollsum(2L^(1:10) + 2L^(11:20), c(1:7, rep(7L, 3L)), adaptive = TRUE, na.rm = TRUE), +basic_sum_result <- bind_rows( + tibble::tibble( + geo_value = rep("a", 10), + time_value = test_date + 1:10, + value = 2L^(1:10), + slide_value = slider::slide_sum(2L^(1:10), before = 6) + ), + tibble::tibble( + geo_value = rep("b", 10), + time_value = test_date + 1:10, + value = 2L^(11:20), + slide_value = slider::slide_sum(2L^(11:20), before = 6) + ) ) %>% tidyr::unchop(c(time_value, value, slide_value)) %>% - dplyr::arrange(time_value) %>% + dplyr::arrange(geo_value, time_value) %>% as_epi_df(as_of = test_date + 100) -basic_mean_result <- tibble::tribble( - ~geo_value, ~time_value, ~value, ~slide_value, - "a", test_date + 1:10, 2L^(1:10), data.table::frollmean(2L^(1:10), c(1:7, rep(7L, 3L)), adaptive = TRUE, na.rm = TRUE), +basic_mean_result <- bind_rows( + tibble::tibble( + geo_value = rep("a", 10), + time_value = test_date + 1:10, + value = 2L^(1:10), + slide_value = slider::slide_mean(2L^(1:10), before = 6) + ) ) %>% tidyr::unchop(c(time_value, value, slide_value)) %>% dplyr::arrange(time_value) %>% as_epi_df(as_of = test_date + 100) -# nolint end: line_length_linter. + # Argument validation tests bad_values <- list( "a", 0.5, -1L, -1.5, 1.5, NA, c(0, 1) ) -purrr::map(bad_values, function(bad_value) { +purrr::walk(bad_values, function(bad_value) { test_that( format_inline("`before` and `after` in epi_slide fail on {bad_value}"), { @@ -69,7 +81,7 @@ purrr::map(bad_values, function(bad_value) { } ) }) -purrr::map(bad_values, function(bad_value) { +purrr::walk(bad_values, function(bad_value) { test_that(format_inline("`before` and `after` in epi_slide_mean fail on {bad_value}"), { expect_error( epi_slide_mean(grouped, col_names = value, before = bad_value, ref_time_values = test_date + 2), @@ -83,7 +95,7 @@ purrr::map(bad_values, function(bad_value) { }) bad_values <- c(min(grouped$time_value) - 1, max(grouped$time_value) + 1) -purrr::map(bad_values, function(bad_value) { +purrr::walk(bad_values, function(bad_value) { test_that(format_inline("epi_slide[_mean]: `ref_time_values` out of range for all groups {bad_value}"), { expect_error( epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = bad_value), @@ -148,61 +160,311 @@ test_that("epi_slide alerts if the provided f doesn't take enough args", { # Common example tests -for (rtv in list(NULL, test_date + 1, c(test_date + 1, test_date + 3))) { - test_that(format_inline("epi_slide works with formulas, lists, and data.frame outputs with ref_time_value {rtv}"), { - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ sum(.x$value), ref_time_values = rtv), - basic_sum_result %>% - { - if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . - } - ) - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ list(rep(sum(.x$value), 2L)), ref_time_values = rtv), - basic_sum_result %>% mutate(slide_value = lapply(slide_value, rep, 2L)) %>% - { - if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . +for (all_rows in list(FALSE, TRUE)) { + for (rtv in list(NULL, test_date + 1, c(test_date + 1, test_date + 3, test_date + 7))) { + test_that( + format_inline( + "epi_slide works with formulas, lists, and data.frame outputs with ref_time_value={rtv} + and all_rows={all_rows}" + ), + { + simpler_slide_call <- function(f) { + toy_edf %>% + group_by(geo_value) %>% + epi_slide( + before = 6 * days_dt, f, + ref_time_values = rtv, all_rows = all_rows + ) %>% + ungroup() } - ) - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value)), ref_time_values = rtv), - basic_sum_result %>% - { - if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + filter_expected <- function(x) { + if (all_rows && !is.null(rtv)) { + dplyr::mutate(x, slide_value = dplyr::if_else(time_value %in% rtv, slide_value, NA)) + } else if (!is.null(rtv)) { + dplyr::filter(x, time_value %in% rtv) + } else { + x + } } + + expect_equal( + simpler_slide_call(~ sum(.x$value)), + basic_sum_result %>% filter_expected() + ) + + expect_equal( + simpler_slide_call(~ list(rep(sum(.x$value), 2L))), + basic_sum_result %>% mutate(slide_value = lapply(slide_value, rep, 2L)) %>% filter_expected() + ) + + expect_equal( + simpler_slide_call(~ data.frame(slide_value = sum(.x$value))), + basic_sum_result %>% filter_expected() + ) + + expect_equal( + simpler_slide_call(~ list(data.frame(slide_value = sum(.x$value)))), + basic_sum_result %>% + mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% + filter_expected() + ) + + expect_identical( + simpler_slide_call(~ tibble(slide_value = list(sum(.x$value)))), + basic_sum_result %>% mutate(slide_value = as.list(slide_value)) %>% filter_expected() + ) + + # unnamed data-masking expression producing data frame: + # unfortunately, we can't pass this directly as `f` and need an extra comma + slide_unnamed_df <- toy_edf %>% + group_by(geo_value) %>% + epi_slide( + before = 6L, , data.frame(slide_value = sum(.x$value)), + ref_time_values = rtv, all_rows = all_rows + ) %>% + ungroup() + expect_identical(slide_unnamed_df, basic_sum_result %>% filter_expected()) + } ) - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), - ref_time_values = rtv + } +} + +for (all_rows in list(FALSE, TRUE)) { + for (rtv in list(NULL, test_date + 4, c(test_date + 4, test_date + 5, test_date + 7))) { + test_that( + format_inline( + "epi_slide_sum works with formulas, lists, and data.frame outputs with ref_time_value={rtv} + and all_rows={all_rows}" ), - basic_sum_result %>% - mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% - { - if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . - } - ) - expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ tibble(slide_value = list(sum(.x$value))), ref_time_values = rtv), - basic_sum_result %>% mutate(slide_value = as.list(slide_value)) %>% - { - if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + { + simpler_slide_call <- function(na.rm) { + toy_edf %>% + group_by(geo_value) %>% + epi_slide_sum( + value, + before = 6 * days_dt, + ref_time_values = rtv, all_rows = all_rows, na.rm = na.rm + ) %>% + ungroup() %>% + rename(slide_value = slide_value_value) } - ) - # unnamed data-masking expression producing data frame: - expect_identical( - # unfortunately, we can't pass this directly as `f` and need an extra comma - toy_edf %>% epi_slide(before = 6L, , data.frame(slide_value = sum(.x$value)), ref_time_values = rtv), - basic_sum_result %>% - { - if (!is.null(rtv)) dplyr::filter(., time_value %in% rtv) else . + filter_expected <- function(x) { + if (all_rows && !is.null(rtv)) { + dplyr::mutate(x, slide_value = dplyr::if_else(time_value %in% rtv, slide_value, NA)) + } else if (!is.null(rtv)) { + dplyr::filter(x, time_value %in% rtv) + } else { + x + } } + + expect_equal( + simpler_slide_call(na.rm = TRUE), + basic_sum_result %>% filter_expected() + ) + } ) - }) + } } -# Edge example tests +possible_f <- list(~.ref_time_value, ~.z, ~..3, f = function(x, g, t) t) +purrr::walk(possible_f, function(f) { + test_that("epi_slide computation can use ref_time_value", { + expected_output <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), + dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) + ) %>% + group_by(geo_value) %>% + as_epi_df(as_of = test_date + 6) + + result <- small_x %>% + epi_slide( + f = f, + before = 50 * days_dt + ) + + expect_equal(result, expected_output) + + # Ungrouped with multiple geos + expected_output <- expected_output %>% + ungroup() %>% + arrange(time_value) + + result4 <- small_x %>% + ungroup() %>% + epi_slide( + f = f, + before = 50 * days_dt + ) + expect_equal(result4, expected_output) + }) +}) + + +test_that("epi_slide computation via dots can use ref_time_value and group", { + # ref_time_value + expected_output <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), + dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) + ) %>% + group_by(geo_value) %>% + as_epi_df(as_of = test_date + 6) + + result1 <- small_x %>% + epi_slide( + before = 50 * days_dt, + slide_value = .ref_time_value + ) + + expect_equal(result1, expected_output) + + # `.{x,group_key,ref_time_value}` should be inaccessible from `.data` and + # `.env`. + expect_error(small_x %>% + epi_slide( + before = 50 * days_dt, + slide_value = .env$.ref_time_value + )) + + # group_key + # Use group_key column + expected_output <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = "ak"), + dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = "al") + ) %>% + group_by(geo_value) %>% + as_epi_df(as_of = test_date + 6) + + result3 <- small_x %>% + epi_slide( + before = 2 * days_dt, + slide_value = .group_key$geo_value + ) + + expect_equal(result3, expected_output) + + # Use entire group_key object + expected_output <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = 1L), + dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = 1L) + ) %>% + group_by(geo_value) %>% + as_epi_df(as_of = test_date + 6) + + result4 <- small_x %>% + epi_slide( + before = 2 * days_dt, + slide_value = nrow(.group_key) + ) + + expect_equal(result4, expected_output) + + # Ungrouped with multiple geos + expected_output <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), + dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) + ) %>% + as_epi_df(as_of = test_date + 6) %>% + arrange(time_value) + + result5 <- small_x %>% + ungroup() %>% + epi_slide( + before = 50 * days_dt, + slide_value = .ref_time_value + ) + expect_equal(result5, expected_output) +}) + +test_that("epi_slide computation via dots outputs the same result using col names and the data var", { + expected_output <- small_x %>% + epi_slide( + before = 2 * days_dt, + slide_value = max(time_value) + ) %>% + as_epi_df(as_of = test_date + 6) + + result1 <- small_x %>% + epi_slide( + before = 2 * days_dt, + slide_value = max(.x$time_value) + ) + + expect_equal(result1, expected_output) + + result2 <- small_x %>% + epi_slide( + before = 2 * days_dt, + slide_value = max(.data$time_value) + ) + + expect_equal(result2, expected_output) +}) + +test_that("`epi_slide` can access objects inside of helper functions", { + helper <- function(archive_haystack, time_value_needle) { + archive_haystack %>% epi_slide( + has_needle = time_value_needle %in% time_value, before = 365000L * days_dt + ) + } + expect_error( + helper(small_x, as.Date("2021-01-01")), + NA + ) +}) + +test_that("basic slide behavior is correct when groups have non-overlapping date ranges", { + small_x_misaligned_dates <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15), + dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5)) + ) %>% + as_epi_df(as_of = test_date + 6) %>% + group_by(geo_value) + + expected_output <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = cumsum(11:15) / 1:5), + dplyr::tibble( + geo_value = "al", time_value = test_date + 151:155, value = -(1:5), slide_value = cumsum(-(1:5)) / 1:5 + ) + ) %>% + group_by(geo_value) %>% + as_epi_df(as_of = test_date + 6) + + result1 <- epi_slide(small_x_misaligned_dates, f = ~ mean(.x$value), before = 50 * days_dt) + expect_equal(result1, expected_output) + + result2 <- epi_slide_mean(small_x_misaligned_dates, value, before = 50 * days_dt, na.rm = TRUE) + expect_equal(result2, expected_output %>% rename(slide_value_value = slide_value)) +}) + + +test_that("epi_slide gets correct ref_time_value when groups have non-overlapping date ranges", { + small_x_misaligned_dates <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15), + dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5)) + ) %>% + as_epi_df(as_of = test_date + 6) %>% + group_by(geo_value) + + expected_output <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), + dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5), slide_value = test_date + 151:155) + ) %>% + group_by(geo_value) %>% + as_epi_df(as_of = test_date + 6) + + result1 <- small_x_misaligned_dates %>% + epi_slide( + before = 50 * days_dt, + slide_value = .ref_time_value + ) + + expect_equal(result1, expected_output) +}) + + +# Other example tests test_that("epi_slide can use sequential data masking expressions including NULL", { edf_a <- tibble::tibble( geo_value = 1, @@ -364,221 +626,25 @@ test_that("outputs are recycled", { ) }) -test_that("`ref_time_values` + `all_rows = TRUE` works", { - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ sum(.x$value), - ref_time_values = test_date + c(2L, 8L) - ), - basic_sum_result %>% dplyr::filter(time_value %in% (test_date + c(2L, 8L))) - ) - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ sum(.x$value), - ref_time_values = test_date + c(2L, 8L), all_rows = TRUE - ), - basic_sum_result %>% - dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), - slide_value, NA_real_ # (`^` outputs numeric) - )) - ) - - # slide computations returning data frames: - expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value))), - basic_sum_result - ) - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value)), - ref_time_values = test_date + c(2L, 8L) - ), - basic_sum_result %>% - dplyr::filter(time_value %in% (test_date + c(2L, 8L))) - ) - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value)), - ref_time_values = test_date + c(2L, 8L), all_rows = TRUE - ), - basic_sum_result %>% - dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), - slide_value, NA_integer_ - )) +test_that("`epi_slide` doesn't decay date output", { + expect_true( + ungrouped %>% + epi_slide(before = 5 * days_dt, ~ as.Date("2020-01-01")) %>% + `[[`("slide_value") %>% + inherits("Date") ) +}) - # slide computations returning data frames with `as_list_col=TRUE`: - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))) - ), - basic_sum_result %>% - dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) - ) - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), - ref_time_values = test_date + c(2L, 8L) - ), - basic_sum_result %>% - dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% - dplyr::filter(time_value %in% (test_date + c(2L, 8L))) - ) - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), - ref_time_values = test_date + c(2L, 8L), all_rows = TRUE - ), - basic_sum_result %>% - dplyr::mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% - dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), - slide_value, list(NULL) - )) +test_that("ungrouped epi_slide computation completes successfully", { + expect_no_error( + small_x %>% + ungroup() %>% + epi_slide( + before = 2 * days_dt, + slide_value = sum(.x$value) + ) ) - - # slide computations returning data frames, `as_list_col = TRUE`, `unnest`: - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))) - ) %>% - unnest(slide_value), - basic_sum_result - ) - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), - ref_time_values = test_date + c(2L, 8L) - ) %>% - unnest(slide_value), - basic_sum_result %>% - dplyr::filter(time_value %in% (test_date + c(2L, 8L))) - ) - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), - ref_time_values = test_date + c(2L, 8L), all_rows = TRUE - ) %>% - unnest(slide_value), - basic_sum_result %>% - # XXX unclear exactly what we want in this case. Current approach is - # compatible with `vctrs::vec_detect_missing` but breaks `tidyr::unnest` - # compatibility since the non-ref rows are dropped - dplyr::filter(time_value %in% (test_date + c(2L, 8L))) - ) - rework_nulls <- function(slide_values_list) { - vctrs::vec_assign( - slide_values_list, - vctrs::vec_detect_missing(slide_values_list), - list(vctrs::vec_cast(NA, vctrs::vec_ptype_common(!!!slide_values_list))) - ) - } - expect_equal( - toy_edf %>% epi_slide( - before = 6 * days_dt, ~ list(data.frame(slide_value = sum(.x$value))), - ref_time_values = test_date + c(2L, 8L), all_rows = TRUE - ) %>% - mutate(slide_value = rework_nulls(slide_value)) %>% - unnest(slide_value), - basic_sum_result %>% - dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), - slide_value, NA_integer_ - )) - ) -}) - -test_that("epi_slide_mean works with ref_time_value and all_rows", { - expect_equal( - toy_edf %>% filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, na.rm = TRUE - ), - basic_mean_result %>% - rename(slide_value_value = slide_value) - ) - expect_equal( - toy_edf %>% filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, ref_time_values = test_date + c(2L, 8L), - na.rm = TRUE - ), - filter(basic_mean_result, time_value %in% (test_date + c(2L, 8L))) %>% - rename(slide_value_value = slide_value) - ) - expect_equal( - toy_edf %>% filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, ref_time_values = test_date + c(2L, 8L), all_rows = TRUE, - na.rm = TRUE - ), - basic_mean_result %>% - dplyr::mutate(slide_value = dplyr::if_else(time_value %in% (test_date + c(2L, 8L)), - slide_value, NA_real_ - )) %>% - rename(slide_value_value = slide_value) - ) -}) - -test_that("`epi_slide` doesn't decay date output", { - expect_true( - ungrouped %>% - epi_slide(before = 5 * days_dt, ~ as.Date("2020-01-01")) %>% - `[[`("slide_value") %>% - inherits("Date") - ) -}) - -test_that("basic grouped epi_slide computation produces expected output", { - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = cumsum(11:15)), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = cumsum(-(1:5))) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - # formula - result1 <- epi_slide(small_x, f = ~ sum(.x$value), before = 50 * days_dt) - expect_equal(result1, expected_output) - - # function - result2 <- epi_slide(small_x, f = function(x, g, t) sum(x$value), before = 50 * days_dt) - expect_equal(result2, expected_output) - - # dots - result3 <- epi_slide(small_x, slide_value = sum(value), before = 50 * days_dt) - expect_equal(result3, expected_output) -}) - -test_that("basic grouped epi_slide_mean computation produces expected output", { - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = cumsum(11:15) / 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = cumsum(-(1:5)) / 1:5) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- epi_slide_mean(small_x, value, before = 50 * days_dt, na.rm = TRUE) - expect_equal(result1, expected_output %>% rename(slide_value_value = slide_value)) -}) - -test_that("ungrouped epi_slide computation completes successfully", { - expect_no_error( - small_x %>% - ungroup() %>% - epi_slide( - before = 2 * days_dt, - slide_value = sum(.x$value) - ) - ) -}) +}) test_that("basic ungrouped epi_slide computation produces expected output", { expected_output <- dplyr::bind_rows( @@ -637,233 +703,6 @@ test_that("basic ungrouped epi_slide_mean computation produces expected output", ) }) -test_that("epi_slide computation via formula can use ref_time_value", { - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x %>% - epi_slide( - f = ~.ref_time_value, - before = 50 * days_dt - ) - - expect_equal(result1, expected_output) - - result2 <- small_x %>% - epi_slide( - f = ~.z, - before = 50 * days_dt - ) - - expect_equal(result2, expected_output) - - result3 <- small_x %>% - epi_slide( - f = ~..3, - before = 50 * days_dt - ) - - expect_equal(result3, expected_output) - - # Ungrouped with multiple geos - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) - ) %>% - as_epi_df(as_of = test_date + 6) %>% - arrange(time_value) - - result4 <- small_x %>% - ungroup() %>% - epi_slide( - f = ~.ref_time_value, - before = 50 * days_dt - ) - expect_equal(result4, expected_output) -}) - -test_that("epi_slide computation via function can use ref_time_value", { - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x %>% - epi_slide( - f = function(x, g, t) t, - before = 2 * days_dt - ) - - expect_equal(result1, expected_output) -}) - -test_that("epi_slide computation via dots can use ref_time_value and group", { - # ref_time_value - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x %>% - epi_slide( - before = 50 * days_dt, - slide_value = .ref_time_value - ) - - expect_equal(result1, expected_output) - - # `.{x,group_key,ref_time_value}` should be inaccessible from `.data` and - # `.env`. - expect_error(small_x %>% - epi_slide( - before = 50 * days_dt, - slide_value = .env$.ref_time_value - )) - - # group_key - # Use group_key column - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = "ak"), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = "al") - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result3 <- small_x %>% - epi_slide( - before = 2 * days_dt, - slide_value = .group_key$geo_value - ) - - expect_equal(result3, expected_output) - - # Use entire group_key object - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = 1L), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = 1L) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result4 <- small_x %>% - epi_slide( - before = 2 * days_dt, - slide_value = nrow(.group_key) - ) - - expect_equal(result4, expected_output) - - # Ungrouped with multiple geos - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) - ) %>% - as_epi_df(as_of = test_date + 6) %>% - arrange(time_value) - - result5 <- small_x %>% - ungroup() %>% - epi_slide( - before = 50 * days_dt, - slide_value = .ref_time_value - ) - expect_equal(result5, expected_output) -}) - -test_that("epi_slide computation via dots outputs the same result using col names and the data var", { - expected_output <- small_x %>% - epi_slide( - before = 2 * days_dt, - slide_value = max(time_value) - ) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x %>% - epi_slide( - before = 2 * days_dt, - slide_value = max(.x$time_value) - ) - - expect_equal(result1, expected_output) - - result2 <- small_x %>% - epi_slide( - before = 2 * days_dt, - slide_value = max(.data$time_value) - ) - - expect_equal(result2, expected_output) -}) - -test_that("`epi_slide` can access objects inside of helper functions", { - helper <- function(archive_haystack, time_value_needle) { - archive_haystack %>% epi_slide( - has_needle = time_value_needle %in% time_value, before = 365000L * days_dt - ) - } - expect_error( - helper(small_x, as.Date("2021-01-01")), - NA - ) -}) - -test_that("basic slide behavior is correct when groups have non-overlapping date ranges", { - small_x_misaligned_dates <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15), - dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5)) - ) %>% - as_epi_df(as_of = test_date + 6) %>% - group_by(geo_value) - - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = cumsum(11:15) / 1:5), - dplyr::tibble( - geo_value = "al", time_value = test_date + 151:155, value = -(1:5), slide_value = cumsum(-(1:5)) / 1:5 - ) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- epi_slide(small_x_misaligned_dates, f = ~ mean(.x$value), before = 50 * days_dt) - expect_equal(result1, expected_output) - - result2 <- epi_slide_mean(small_x_misaligned_dates, value, before = 50 * days_dt, na.rm = TRUE) - expect_equal(result2, expected_output %>% rename(slide_value_value = slide_value)) -}) - - -test_that("epi_slide gets correct ref_time_value when groups have non-overlapping date ranges", { - small_x_misaligned_dates <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15), - dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5)) - ) %>% - as_epi_df(as_of = test_date + 6) %>% - group_by(geo_value) - - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5), slide_value = test_date + 151:155) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x_misaligned_dates %>% - epi_slide( - before = 50 * days_dt, - slide_value = .ref_time_value - ) - - expect_equal(result1, expected_output) -}) - time_types <- c("days", "weeks", "yearmonths", "integers") for (time_type in time_types) { test_that(format_inline("epi_slide and epi_slide_mean: different before/after match for {time_type}"), { From 4553b8953377fb29209fd9581b259ff9b2edd83f Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 21 Aug 2024 17:42:57 -0700 Subject: [PATCH 046/110] doc: document --- R/methods-epi_df.R | 1 - man/as_tibble.epi_df.Rd | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index 559ea7d3..1876ab46 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -8,7 +8,6 @@ #' use `attr(your_epi_df, "decay_to_tibble") <- FALSE` beforehand. #' #' @template x -#' @param ... forwarded to `as_tibble` for `data.frame`s #' #' @inheritParams tibble::as_tibble #' diff --git a/man/as_tibble.epi_df.Rd b/man/as_tibble.epi_df.Rd index bf61676a..9d016cd6 100644 --- a/man/as_tibble.epi_df.Rd +++ b/man/as_tibble.epi_df.Rd @@ -9,7 +9,7 @@ \arguments{ \item{x}{an \code{epi_df}} -\item{...}{forwarded to \code{as_tibble} for \code{data.frame}s} +\item{...}{Unused, for extensibility.} } \description{ Converts an \code{epi_df} object into a tibble, dropping metadata and any From 971da0317704f638a0bf07f111903d3a5ea1b553 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 21 Aug 2024 21:27:03 -0700 Subject: [PATCH 047/110] tests: even more slide test refactors --- tests/testthat/test-epi_slide.R | 547 +++++++++++--------------------- 1 file changed, 188 insertions(+), 359 deletions(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 4ccb5aea..8cbde700 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -1,65 +1,53 @@ library(cli) -# Create an epi_df and a function to test epi_slide with test_date <- as.Date("2020-01-01") days_dt <- as.difftime(1, units = "days") weeks_dt <- as.difftime(1, units = "weeks") -ungrouped <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:200, value = 1:200), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5)) -) %>% - as_epi_df() -grouped <- ungrouped %>% - group_by(geo_value) - -small_x <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5)) -) %>% - as_epi_df(as_of = test_date + 6) %>% - group_by(geo_value) - -f <- function(x, g, t) dplyr::tibble(avg = mean(x$value), count = length(x$value)) - +n <- 30 +# A tibble with two geos on the same time index and one geo with a different but +# overlapping time index toy_edf <- tibble::tribble( ~geo_value, ~time_value, ~value, - "a", test_date + 1:10, 2L^(1:10), - "b", test_date + 1:10, 2L^(11:20), -) %>% - tidyr::unchop(c(time_value, value)) %>% - as_epi_df(as_of = test_date + 100) - -basic_sum_result <- bind_rows( - tibble::tibble( - geo_value = rep("a", 10), - time_value = test_date + 1:10, - value = 2L^(1:10), - slide_value = slider::slide_sum(2L^(1:10), before = 6) - ), - tibble::tibble( - geo_value = rep("b", 10), - time_value = test_date + 1:10, - value = 2L^(11:20), - slide_value = slider::slide_sum(2L^(11:20), before = 6) - ) + "a", test_date + 1:n, 1:n, + "b", test_date + 1:n, 10 * n + 1:n, + "c", test_date + floor(n / 2) + 1:n, 100 * n + 1:n ) %>% - tidyr::unchop(c(time_value, value, slide_value)) %>% - dplyr::arrange(geo_value, time_value) %>% - as_epi_df(as_of = test_date + 100) - -basic_mean_result <- bind_rows( - tibble::tibble( - geo_value = rep("a", 10), - time_value = test_date + 1:10, - value = 2L^(1:10), - slide_value = slider::slide_mean(2L^(1:10), before = 6) - ) -) %>% - tidyr::unchop(c(time_value, value, slide_value)) %>% - dplyr::arrange(time_value) %>% + tidyr::unnest_longer(c(time_value, value)) %>% as_epi_df(as_of = test_date + 100) +toy_edf_g <- toy_edf %>% group_by(geo_value) +overlap_index <- toy_edf %>% + group_by(geo_value) %>% + summarize(time_values = list(time_value)) %>% + pull(time_values) %>% + Reduce(intersect, .) %>% + as.Date() + +# Utility functions for computing expected slide_sum output +compute_slide_external <- function(before, overlap = FALSE) { + if (overlap) { + toy_edf <- toy_edf %>% + filter(time_value %in% overlap_index) + toy_edf_g <- toy_edf_g %>% + filter(time_value %in% overlap_index) + } + slide_value <- toy_edf %>% + group_by(time_value) %>% + summarize(value = sum(value)) %>% + pull(value) %>% + slider::slide_sum(before = before) + toy_edf_g %>% + mutate(slide_value = slide_value) %>% + ungroup() +} +compute_slide_external_g <- function(before) { + toy_edf_g %>% + mutate(slide_value = slider::slide_sum(value, before = before)) %>% + dplyr::arrange(geo_value, time_value) %>% + as_epi_df(as_of = test_date + 100) +} +f_tib_avg_count <- function(x, g, t) dplyr::tibble(avg = mean(x$value), count = length(x$value)) # Argument validation tests @@ -71,11 +59,11 @@ purrr::walk(bad_values, function(bad_value) { format_inline("`before` and `after` in epi_slide fail on {bad_value}"), { expect_error( - epi_slide(grouped, before = bad_value, ref_time_values = test_date + 2), + epi_slide(toy_edf_g, before = bad_value, ref_time_values = test_date + 2), class = "epiprocess__validate_slide_window_arg" ) expect_error( - epi_slide(grouped, after = bad_value, ref_time_values = test_date + 2), + epi_slide(toy_edf_g, after = bad_value, ref_time_values = test_date + 2), class = "epiprocess__validate_slide_window_arg" ) } @@ -84,25 +72,25 @@ purrr::walk(bad_values, function(bad_value) { purrr::walk(bad_values, function(bad_value) { test_that(format_inline("`before` and `after` in epi_slide_mean fail on {bad_value}"), { expect_error( - epi_slide_mean(grouped, col_names = value, before = bad_value, ref_time_values = test_date + 2), + epi_slide_mean(toy_edf_g, col_names = value, before = bad_value, ref_time_values = test_date + 2), class = "epiprocess__validate_slide_window_arg" ) expect_error( - epi_slide_mean(grouped, col_names = value, after = bad_value, ref_time_values = test_date + 2), + epi_slide_mean(toy_edf_g, col_names = value, after = bad_value, ref_time_values = test_date + 2), class = "epiprocess__validate_slide_window_arg" ) }) }) -bad_values <- c(min(grouped$time_value) - 1, max(grouped$time_value) + 1) +bad_values <- c(min(toy_edf_g$time_value) - 1, max(toy_edf_g$time_value) + 1) purrr::walk(bad_values, function(bad_value) { test_that(format_inline("epi_slide[_mean]: `ref_time_values` out of range for all groups {bad_value}"), { expect_error( - epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = bad_value), + epi_slide(toy_edf_g, f_tib_avg_count, before = 2 * days_dt, ref_time_values = bad_value), class = "epi_slide__invalid_ref_time_values" ) expect_error( - epi_slide_mean(grouped, col_names = value, before = 2 * days_dt, ref_time_values = bad_value), + epi_slide_mean(toy_edf_g, col_names = value, before = 2 * days_dt, ref_time_values = bad_value), class = "epi_slide_opt__invalid_ref_time_values" ) }) @@ -112,19 +100,14 @@ test_that( "epi_slide or epi_slide_mean: `ref_time_values` in range for at least one group generate no error", { expect_equal( - epi_slide(grouped, f, before = 2 * days_dt, ref_time_values = test_date + 200L) %>% - ungroup() %>% - dplyr::select("geo_value", "avg"), - dplyr::tibble(geo_value = "ak", avg = 199) + epi_slide(toy_edf_g, ~ sum(.x$value), before = 2 * days_dt, ref_time_values = test_date + 5) %>% ungroup(), + compute_slide_external_g(before = 2) %>% ungroup() %>% filter(time_value == test_date + 5) ) expect_equal( - epi_slide_mean( - grouped, value, - before = 2 * days_dt, ref_time_values = test_date + 200L, na.rm = TRUE - ) %>% + epi_slide_sum(toy_edf_g, value, before = 2 * days_dt, ref_time_values = test_date + 5, na.rm = TRUE) %>% ungroup() %>% - dplyr::select("geo_value", "slide_value_value"), - dplyr::tibble(geo_value = "ak", slide_value_value = 199) + rename(slide_value = slide_value_value), + compute_slide_external_g(before = 2) %>% ungroup() %>% filter(time_value == test_date + 5) ) } ) @@ -144,24 +127,24 @@ test_that("epi_slide_mean errors when `as_list_col` non-NULL", { }) test_that("epi_slide alerts if the provided f doesn't take enough args", { - f_xgt <- function(x, g, t) dplyr::tibble(value = mean(x$value), count = length(x$value)) expect_no_error( - epi_slide(grouped, f_xgt, before = days_dt, ref_time_values = test_date + 1), + epi_slide(toy_edf_g, f_tib_avg_count, before = days_dt, ref_time_values = test_date + 1), ) expect_no_warning( - epi_slide(grouped, f_xgt, before = days_dt, ref_time_values = test_date + 1), + epi_slide(toy_edf_g, f_tib_avg_count, before = days_dt, ref_time_values = test_date + 1), ) f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$value), count = length(x$value)) - expect_warning(epi_slide(grouped, f_x_dots, before = days_dt, ref_time_values = test_date + 1), + expect_warning(epi_slide(toy_edf_g, f_x_dots, before = days_dt, ref_time_values = test_date + 1), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) }) -# Common example tests +# Common example tests: epi_slide over grouped epi_dfs on common ref_time_values +# TODO: doesn't work on non-overlapping ref_time_values for (all_rows in list(FALSE, TRUE)) { - for (rtv in list(NULL, test_date + 1, c(test_date + 1, test_date + 3, test_date + 7))) { + for (rtv in list(NULL, overlap_index[1:3])) { test_that( format_inline( "epi_slide works with formulas, lists, and data.frame outputs with ref_time_value={rtv} @@ -169,13 +152,11 @@ for (all_rows in list(FALSE, TRUE)) { ), { simpler_slide_call <- function(f) { - toy_edf %>% - group_by(geo_value) %>% + toy_edf_g %>% epi_slide( before = 6 * days_dt, f, ref_time_values = rtv, all_rows = all_rows - ) %>% - ungroup() + ) } filter_expected <- function(x) { if (all_rows && !is.null(rtv)) { @@ -189,65 +170,59 @@ for (all_rows in list(FALSE, TRUE)) { expect_equal( simpler_slide_call(~ sum(.x$value)), - basic_sum_result %>% filter_expected() + compute_slide_external_g(before = 6) %>% filter_expected() ) expect_equal( simpler_slide_call(~ list(rep(sum(.x$value), 2L))), - basic_sum_result %>% mutate(slide_value = lapply(slide_value, rep, 2L)) %>% filter_expected() + compute_slide_external_g(before = 6) %>% + mutate(slide_value = lapply(slide_value, rep, 2L)) %>% + filter_expected() ) expect_equal( simpler_slide_call(~ data.frame(slide_value = sum(.x$value))), - basic_sum_result %>% filter_expected() + compute_slide_external_g(before = 6) %>% filter_expected() ) expect_equal( simpler_slide_call(~ list(data.frame(slide_value = sum(.x$value)))), - basic_sum_result %>% + compute_slide_external_g(before = 6) %>% mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% filter_expected() ) expect_identical( simpler_slide_call(~ tibble(slide_value = list(sum(.x$value)))), - basic_sum_result %>% mutate(slide_value = as.list(slide_value)) %>% filter_expected() + compute_slide_external_g(before = 6) %>% mutate(slide_value = as.list(slide_value)) %>% filter_expected() ) # unnamed data-masking expression producing data frame: # unfortunately, we can't pass this directly as `f` and need an extra comma - slide_unnamed_df <- toy_edf %>% - group_by(geo_value) %>% + slide_unnamed_df <- toy_edf_g %>% epi_slide( before = 6L, , data.frame(slide_value = sum(.x$value)), ref_time_values = rtv, all_rows = all_rows - ) %>% - ungroup() - expect_identical(slide_unnamed_df, basic_sum_result %>% filter_expected()) + ) + expect_identical( + slide_unnamed_df, + compute_slide_external_g(before = 6) %>% filter_expected() + ) } ) } } +# Common example tests: epi_slide_sum over grouped epi_dfs on common ref_time_values +# TODO: doesn't work on non-overlapping ref_time_values for most of these for (all_rows in list(FALSE, TRUE)) { - for (rtv in list(NULL, test_date + 4, c(test_date + 4, test_date + 5, test_date + 7))) { + for (rtv in list(NULL, overlap_index)) { test_that( format_inline( "epi_slide_sum works with formulas, lists, and data.frame outputs with ref_time_value={rtv} and all_rows={all_rows}" ), { - simpler_slide_call <- function(na.rm) { - toy_edf %>% - group_by(geo_value) %>% - epi_slide_sum( - value, - before = 6 * days_dt, - ref_time_values = rtv, all_rows = all_rows, na.rm = na.rm - ) %>% - ungroup() %>% - rename(slide_value = slide_value_value) - } filter_expected <- function(x) { if (all_rows && !is.null(rtv)) { dplyr::mutate(x, slide_value = dplyr::if_else(time_value %in% rtv, slide_value, NA)) @@ -259,133 +234,80 @@ for (all_rows in list(FALSE, TRUE)) { } expect_equal( - simpler_slide_call(na.rm = TRUE), - basic_sum_result %>% filter_expected() + toy_edf_g %>% + epi_slide_sum( + value, + before = 6 * days_dt, + ref_time_values = rtv, all_rows = all_rows, na.rm = TRUE + ) %>% + rename(slide_value = slide_value_value), + compute_slide_external_g(before = 6) %>% filter_expected() ) } ) } } - possible_f <- list(~.ref_time_value, ~.z, ~..3, f = function(x, g, t) t) purrr::walk(possible_f, function(f) { test_that("epi_slide computation can use ref_time_value", { - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result <- small_x %>% - epi_slide( - f = f, - before = 50 * days_dt - ) - - expect_equal(result, expected_output) + # Grouped with multiple geos + expect_equal( + toy_edf_g %>% epi_slide(f = f, before = 50 * days_dt), + toy_edf_g %>% mutate(slide_value = time_value) + ) # Ungrouped with multiple geos - expected_output <- expected_output %>% - ungroup() %>% - arrange(time_value) - - result4 <- small_x %>% - ungroup() %>% - epi_slide( - f = f, - before = 50 * days_dt - ) - expect_equal(result4, expected_output) + expect_equal( + toy_edf %>% epi_slide(f = f, before = 50 * days_dt), + toy_edf %>% mutate(slide_value = time_value) %>% arrange(time_value) + ) }) }) - test_that("epi_slide computation via dots can use ref_time_value and group", { - # ref_time_value - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x %>% - epi_slide( - before = 50 * days_dt, - slide_value = .ref_time_value - ) - - expect_equal(result1, expected_output) + # Use ref_time_value + expect_equal( + toy_edf_g %>% epi_slide(before = 50 * days_dt, slide_value = .ref_time_value), + toy_edf_g %>% mutate(slide_value = time_value) + ) # `.{x,group_key,ref_time_value}` should be inaccessible from `.data` and # `.env`. - expect_error(small_x %>% + expect_error(toy_edf_g %>% epi_slide( before = 50 * days_dt, slide_value = .env$.ref_time_value )) - # group_key - # Use group_key column - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = "ak"), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = "al") - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result3 <- small_x %>% - epi_slide( - before = 2 * days_dt, - slide_value = .group_key$geo_value - ) - - expect_equal(result3, expected_output) + # Grouped and use group key as value + expect_equal( + toy_edf_g %>% epi_slide(before = 2 * days_dt, slide_value = .group_key$geo_value), + toy_edf_g %>% mutate(slide_value = geo_value) + ) # Use entire group_key object - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = 1L), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = 1L) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result4 <- small_x %>% - epi_slide( - before = 2 * days_dt, - slide_value = nrow(.group_key) - ) - - expect_equal(result4, expected_output) + expect_equal( + toy_edf_g %>% epi_slide(before = 2 * days_dt, slide_value = nrow(.group_key)), + toy_edf_g %>% mutate(slide_value = 1L) + ) # Ungrouped with multiple geos - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = test_date + 1:5) - ) %>% - as_epi_df(as_of = test_date + 6) %>% - arrange(time_value) - - result5 <- small_x %>% - ungroup() %>% - epi_slide( - before = 50 * days_dt, - slide_value = .ref_time_value - ) - expect_equal(result5, expected_output) + expect_equal( + toy_edf %>% epi_slide(before = 50 * days_dt, slide_value = .ref_time_value), + toy_edf %>% mutate(slide_value = time_value) %>% arrange(time_value) + ) }) test_that("epi_slide computation via dots outputs the same result using col names and the data var", { - expected_output <- small_x %>% + expected_output <- toy_edf %>% epi_slide( before = 2 * days_dt, slide_value = max(time_value) ) %>% as_epi_df(as_of = test_date + 6) - result1 <- small_x %>% + result1 <- toy_edf %>% epi_slide( before = 2 * days_dt, slide_value = max(.x$time_value) @@ -393,7 +315,7 @@ test_that("epi_slide computation via dots outputs the same result using col name expect_equal(result1, expected_output) - result2 <- small_x %>% + result2 <- toy_edf %>% epi_slide( before = 2 * days_dt, slide_value = max(.data$time_value) @@ -409,58 +331,42 @@ test_that("`epi_slide` can access objects inside of helper functions", { ) } expect_error( - helper(small_x, as.Date("2021-01-01")), + helper(toy_edf, as.Date("2021-01-01")), NA ) }) -test_that("basic slide behavior is correct when groups have non-overlapping date ranges", { - small_x_misaligned_dates <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15), - dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5)) - ) %>% - as_epi_df(as_of = test_date + 6) %>% - group_by(geo_value) - - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = cumsum(11:15) / 1:5), - dplyr::tibble( - geo_value = "al", time_value = test_date + 151:155, value = -(1:5), slide_value = cumsum(-(1:5)) / 1:5 - ) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- epi_slide(small_x_misaligned_dates, f = ~ mean(.x$value), before = 50 * days_dt) - expect_equal(result1, expected_output) - - result2 <- epi_slide_mean(small_x_misaligned_dates, value, before = 50 * days_dt, na.rm = TRUE) - expect_equal(result2, expected_output %>% rename(slide_value_value = slide_value)) +# TODO: Only works with overlapping ref_time_values +test_that("basic ungrouped epi_slide computation produces expected output", { + # Single geo + expect_equal( + toy_edf %>% filter(geo_value == "a") %>% epi_slide(before = 50 * days_dt, slide_value = sum(.x$value)), + compute_slide_external_g(before = 50) %>% ungroup() %>% filter(geo_value == "a") %>% arrange(time_value) + ) + # Multiple geos + expect_equal( + toy_edf %>% filter(time_value %in% overlap_index) %>% epi_slide(before = 50 * days_dt, slide_value = sum(.x$value)), + compute_slide_external(before = 50, overlap = TRUE) %>% arrange(time_value) + ) }) +test_that("basic ungrouped epi_slide_mean computation produces expected output", { + # Single geo + expect_equal( + toy_edf %>% + filter(geo_value == "a") %>% + epi_slide_sum(value, before = 50 * days_dt, na.rm = TRUE) %>% + rename(slide_value = slide_value_value), + compute_slide_external_g(before = 50) %>% ungroup() %>% filter(geo_value == "a") %>% arrange(time_value) + ) -test_that("epi_slide gets correct ref_time_value when groups have non-overlapping date ranges", { - small_x_misaligned_dates <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15), - dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5)) - ) %>% - as_epi_df(as_of = test_date + 6) %>% - group_by(geo_value) - - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = test_date + 1:5), - dplyr::tibble(geo_value = "al", time_value = test_date + 151:155, value = -(1:5), slide_value = test_date + 151:155) - ) %>% - group_by(geo_value) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x_misaligned_dates %>% - epi_slide( - before = 50 * days_dt, - slide_value = .ref_time_value - ) - - expect_equal(result1, expected_output) + # Multiple geos + # epi_slide_sum fails when input data groups contain duplicate time_values, + # e.g. aggregating across geos + expect_error( + toy_edf %>% epi_slide_sum(value, before = 6 * days_dt), + class = "epiprocess__epi_slide_opt__duplicate_time_values" + ) }) @@ -550,159 +456,82 @@ test_that("epi_slide can use {nm} :=", { nm <- "slide_value" expect_identical( # unfortunately, we can't pass this directly as `f` and need an extra comma - toy_edf %>% epi_slide(before = 6L, , !!nm := sum(value)), - basic_sum_result + toy_edf_g %>% epi_slide(before = 6L, , !!nm := sum(value)), + compute_slide_external_g(before = 6) ) }) test_that("epi_slide can produce packed outputs", { - packed_basic_result <- basic_sum_result %>% + packed_basic_result <- compute_slide_external_g(before = 6) %>% tidyr::pack(container = c(slide_value)) %>% - dplyr_reconstruct(basic_sum_result) + dplyr_reconstruct(compute_slide_external_g(before = 6)) expect_identical( - toy_edf %>% epi_slide(before = 6L, ~ tibble::tibble(slide_value = sum(.x$value)), new_col_name = "container"), + toy_edf_g %>% epi_slide(before = 6L, ~ tibble::tibble(slide_value = sum(.x$value)), new_col_name = "container"), packed_basic_result ) expect_identical( - toy_edf %>% epi_slide(before = 6L, container = tibble::tibble(slide_value = sum(.x$value))), + toy_edf_g %>% epi_slide(before = 6L, container = tibble::tibble(slide_value = sum(.x$value))), packed_basic_result ) expect_identical( - toy_edf %>% epi_slide(before = 6L, , tibble::tibble(slide_value = sum(.x$value)), new_col_name = "container"), + toy_edf_g %>% epi_slide(before = 6L, , tibble::tibble(slide_value = sum(.x$value)), new_col_name = "container"), packed_basic_result ) }) test_that("nested dataframe output names are controllable", { expect_equal( - toy_edf %>% - epi_slide( - before = 6 * days_dt, ~ data.frame(result = sum(.x$value)) - ), - basic_sum_result %>% rename(result = slide_value) + toy_edf_g %>% epi_slide(before = 6 * days_dt, ~ data.frame(result = sum(.x$value))), + compute_slide_external_g(before = 6) %>% rename(result = slide_value) ) expect_equal( - toy_edf %>% - epi_slide( - before = 6 * days_dt, ~ data.frame(value_sum = sum(.x$value)) - ), - basic_sum_result %>% rename(value_sum = slide_value) + toy_edf_g %>% epi_slide(before = 6 * days_dt, ~ data.frame(value_sum = sum(.x$value))), + compute_slide_external_g(before = 6) %>% rename(value_sum = slide_value) ) }) -test_that("outputs are recycled", { - # trying with non-size-1 computation outputs: - # nolint start: line_length_linter. - basic_result_from_size2 <- tibble::tribble( - ~geo_value, ~time_value, ~value, ~slide_value, - "a", test_date + 1:10, 2L^(1:10), data.table::frollsum(2L^(1:10) + 2L^(11:20), c(1:7, rep(7L, 3L)), adaptive = TRUE, na.rm = TRUE), - "b", test_date + 1:10, 2L^(11:20), data.table::frollsum(2L^(1:10) + 2L^(11:20), c(1:7, rep(7L, 3L)), adaptive = TRUE, na.rm = TRUE) + 1L, - ) %>% - tidyr::unchop(c(time_value, value, slide_value)) %>% - dplyr::arrange(time_value) %>% - as_epi_df(as_of = test_date + 100) - # nolint end - # - # non-size-1 outputs with appropriate size are no-op "recycled": +# TODO: This seems really strange and counter-intuitive. Deprecate?4 +test_that("non-size-1 f outputs are no-op recycled", { expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ sum(.x$value) + 0:1), - basic_result_from_size2 + toy_edf %>% filter(time_value %in% overlap_index) %>% epi_slide(before = 6 * days_dt, ~ sum(.x$value) + c(0, 0, 0)), + compute_slide_external(before = 6, overlap = TRUE) %>% arrange(time_value) ) expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ as.list(sum(.x$value) + 0:1)), - basic_result_from_size2 %>% dplyr::mutate(slide_value = as.list(slide_value)) + toy_edf %>% + filter(time_value %in% overlap_index) %>% + epi_slide(before = 6 * days_dt, ~ as.list(sum(.x$value) + c(0, 0, 0))), + compute_slide_external(before = 6, overlap = TRUE) %>% + dplyr::mutate(slide_value = as.list(slide_value)) %>% + arrange(time_value) ) expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value) + 0:1)), - basic_result_from_size2 + toy_edf %>% + filter(time_value %in% overlap_index) %>% + epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value) + c(0, 0, 0))), + compute_slide_external(before = 6, overlap = TRUE) %>% arrange(time_value) ) # size-1 list is recycled: expect_equal( - toy_edf %>% epi_slide(before = 6 * days_dt, ~ list(tibble(value = sum(.x$value) + 0:1))), - basic_result_from_size2 %>% + toy_edf %>% + filter(time_value %in% overlap_index) %>% + epi_slide(before = 6 * days_dt, ~ list(tibble(value = sum(.x$value) + c(0, 0, 0)))), + compute_slide_external(before = 6, overlap = TRUE) %>% group_by(time_value) %>% - mutate(slide_value = rep(list(tibble(value = slide_value)), 2L)) %>% - ungroup() + mutate(slide_value = rep(list(tibble(value = slide_value)), 3L)) %>% + ungroup() %>% + arrange(time_value) ) }) -test_that("`epi_slide` doesn't decay date output", { +test_that("`epi_slide` doesn't lose Date class output", { expect_true( - ungrouped %>% + toy_edf %>% epi_slide(before = 5 * days_dt, ~ as.Date("2020-01-01")) %>% `[[`("slide_value") %>% inherits("Date") ) }) -test_that("ungrouped epi_slide computation completes successfully", { - expect_no_error( - small_x %>% - ungroup() %>% - epi_slide( - before = 2 * days_dt, - slide_value = sum(.x$value) - ) - ) -}) - -test_that("basic ungrouped epi_slide computation produces expected output", { - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = cumsum(11:15)) - ) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x %>% - ungroup() %>% - filter(geo_value == "ak") %>% - epi_slide( - before = 50 * days_dt, - slide_value = sum(.x$value) - ) - expect_equal(result1, expected_output) - - # Ungrouped with multiple geos - expected_output <- dplyr::bind_rows( - dplyr::tibble( - geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = cumsum(11:15) + cumsum(-(1:5)) - ), - dplyr::tibble( - geo_value = "al", time_value = test_date + 1:5, value = -(1:5), slide_value = cumsum(11:15) + cumsum(-(1:5)) - ) - ) %>% - as_epi_df(as_of = test_date + 6) %>% - arrange(time_value) - - result2 <- small_x %>% - ungroup() %>% - epi_slide( - before = 50 * days_dt, - slide_value = sum(.x$value) - ) - expect_equal(result2, expected_output) -}) - -test_that("basic ungrouped epi_slide_mean computation produces expected output", { - expected_output <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:5, value = 11:15, slide_value = cumsum(11:15) / 1:5), - ) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- small_x %>% - ungroup() %>% - filter(geo_value == "ak") %>% - epi_slide_mean(value, before = 50 * days_dt, na.rm = TRUE) - expect_equal(result1, expected_output %>% rename(slide_value_value = slide_value)) - - # Ungrouped with multiple geos - # epi_slide_mean fails when input data groups contain duplicate time_values, - # e.g. aggregating across geos - expect_error( - small_x %>% ungroup() %>% epi_slide_mean(value, before = 6 * days_dt), - class = "epiprocess__epi_slide_opt__duplicate_time_values" - ) -}) - time_types <- c("days", "weeks", "yearmonths", "integers") for (time_type in time_types) { test_that(format_inline("epi_slide and epi_slide_mean: different before/after match for {time_type}"), { @@ -887,22 +716,22 @@ test_that("helper `full_date_seq` returns expected date values", { ) }) -test_that("epi_slide_mean/sum produces same output as epi_slide_opt", { +test_that("epi_slide_mean/sum produces same output as epi_slide_opt grouped", { expect_equal( - epi_slide_mean(small_x, value, before = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(small_x, value, f = data.table::frollmean, before = 50 * days_dt, na.rm = TRUE) + epi_slide_mean(toy_edf_g, value, before = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(toy_edf_g, value, f = data.table::frollmean, before = 50 * days_dt, na.rm = TRUE) ) expect_equal( - epi_slide_mean(small_x, value, before = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(small_x, value, f = slider::slide_mean, before = 50 * days_dt, na_rm = TRUE) + epi_slide_mean(toy_edf_g, value, before = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(toy_edf_g, value, f = slider::slide_mean, before = 50 * days_dt, na_rm = TRUE) ) expect_equal( - epi_slide_sum(small_x, value, before = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(small_x, value, f = data.table::frollsum, before = 50 * days_dt, na.rm = TRUE) + epi_slide_sum(toy_edf_g, value, before = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(toy_edf_g, value, f = data.table::frollsum, before = 50 * days_dt, na.rm = TRUE) ) expect_equal( - epi_slide_sum(small_x, value, before = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(small_x, value, f = slider::slide_sum, before = 50 * days_dt, na_rm = TRUE) + epi_slide_sum(toy_edf_g, value, before = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(toy_edf_g, value, f = slider::slide_sum, before = 50 * days_dt, na_rm = TRUE) ) }) @@ -910,14 +739,14 @@ test_that("`epi_slide_opt` errors when passed non-`data.table`, non-`slider` fun reexport_frollmean <- data.table::frollmean expect_no_error( epi_slide_opt( - grouped, + toy_edf_g, col_names = value, f = reexport_frollmean, before = days_dt, ref_time_values = test_date + 1 ) ) expect_error( epi_slide_opt( - grouped, + toy_edf_g, col_names = value, f = mean, before = days_dt, ref_time_values = test_date + 1 ), From 871946f34c33a37a462f386ed12c754da394c653 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 21 Aug 2024 21:28:25 -0700 Subject: [PATCH 048/110] lint: lint --- R/utils.R | 10 ++++++++-- tests/testthat/test-epi_slide.R | 18 ++++++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/R/utils.R b/R/utils.R index bede5957..9c47594d 100644 --- a/R/utils.R +++ b/R/utils.R @@ -877,11 +877,17 @@ guess_period.POSIXt <- function(time_values, time_values_arg = rlang::caller_arg validate_slide_window_arg <- function(arg, time_type, allow_inf = TRUE, arg_name = rlang::caller_arg(arg)) { if (is.null(arg)) { - cli_abort("`{arg_name}` is a required argument for slide functions.", class = "epiprocess__validate_slide_window_arg") + cli_abort( + "`{arg_name}` is a required argument for slide functions.", + class = "epiprocess__validate_slide_window_arg" + ) } if (!checkmate::test_scalar(arg)) { - cli_abort("Slide function expected `{arg_name}` to be a scalar value.", class = "epiprocess__validate_slide_window_arg") + cli_abort( + "Slide function expected `{arg_name}` to be a scalar value.", + class = "epiprocess__validate_slide_window_arg" + ) } if (time_type == "custom") { diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 8cbde700..dcf121f6 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -612,7 +612,8 @@ test_that("helper `full_date_seq` returns expected date values", { expect_identical( full_date_seq( - epi_data_missing %>% mutate(time_value = days) %>% + epi_data_missing %>% + mutate(time_value = days) %>% as_epi_df() %>% group_by(geo_value), before = before * days_dt, after = after * days_dt, time_type = "day" @@ -628,7 +629,8 @@ test_that("helper `full_date_seq` returns expected date values", { ) expect_identical( full_date_seq( - epi_data_missing %>% mutate(time_value = weeks) %>% + epi_data_missing %>% + mutate(time_value = weeks) %>% as_epi_df() %>% group_by(geo_value), before = before, after = after, time_type = "week" @@ -644,7 +646,8 @@ test_that("helper `full_date_seq` returns expected date values", { ) expect_identical( full_date_seq( - epi_data_missing %>% mutate(time_value = yearmonths) %>% + epi_data_missing %>% + mutate(time_value = yearmonths) %>% as_epi_df() %>% group_by(geo_value), before = before, after = after, time_type = "yearmonth" @@ -657,7 +660,8 @@ test_that("helper `full_date_seq` returns expected date values", { ) expect_identical( full_date_seq( - epi_data_missing %>% mutate(time_value = integers) %>% + epi_data_missing %>% + mutate(time_value = integers) %>% as_epi_df() %>% group_by(geo_value), before = before, after = after, time_type = "integer" @@ -675,7 +679,8 @@ test_that("helper `full_date_seq` returns expected date values", { expect_identical( full_date_seq( - epi_data_missing %>% mutate(time_value = days) %>% + epi_data_missing %>% + mutate(time_value = days) %>% as_epi_df() %>% group_by(geo_value), before = before * days_dt, after = after * days_dt, time_type = "day" @@ -698,7 +703,8 @@ test_that("helper `full_date_seq` returns expected date values", { expect_identical( full_date_seq( - epi_data_missing %>% mutate(time_value = days) %>% + epi_data_missing %>% + mutate(time_value = days) %>% as_epi_df() %>% group_by(geo_value), before = before * days_dt, after = after * days_dt, time_type = "day" From de948b55db3ade484e41ed95e88143e95d72128d Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Thu, 22 Aug 2024 18:49:33 -0700 Subject: [PATCH 049/110] wip: rework slide window args (#513) * feat!: breaking rework to epi_slide interface --- DESCRIPTION | 1 - R/autoplot.R | 4 +- R/correlation.R | 2 +- R/growth_rate.R | 2 +- R/outliers.R | 7 +- R/slide.R | 582 +++++++++++++++++------------- man-roxygen/basic-slide-details.R | 64 ++-- man-roxygen/basic-slide-params.R | 71 ++-- man-roxygen/opt-slide-details.R | 49 ++- man-roxygen/opt-slide-params.R | 5 +- man/epi_slide.Rd | 205 +++++------ man/epi_slide_mean.Rd | 164 ++++----- man/epi_slide_opt.Rd | 190 +++++----- man/epi_slide_sum.Rd | 148 ++++---- tests/testthat/test-epi_slide.R | 393 ++++++++++---------- vignettes/advanced.Rmd | 106 ++---- vignettes/aggregation.Rmd | 6 +- vignettes/archive.Rmd | 6 +- vignettes/slide.Rmd | 35 +- 19 files changed, 1030 insertions(+), 1010 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f78076c3..81f1871e 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -31,7 +31,6 @@ Imports: data.table, dplyr (>= 1.0.8), genlasso, - glue, ggplot2, glue, lifecycle (>= 1.0.1), diff --git a/R/autoplot.R b/R/autoplot.R index 7443628b..23f480fe 100644 --- a/R/autoplot.R +++ b/R/autoplot.R @@ -47,8 +47,8 @@ autoplot.epi_df <- function( .facet_by = c(".response", "other_keys", "all_keys", "geo_value", "all", "none"), .base_color = "#3A448F", .max_facets = Inf) { - .color_by <- match.arg(.color_by) - .facet_by <- match.arg(.facet_by) + .color_by <- rlang::arg_match(.color_by) + .facet_by <- rlang::arg_match(.facet_by) assert(anyInfinite(.max_facets), checkInt(.max_facets), combine = "or") assert_character(.base_color, len = 1) diff --git a/R/correlation.R b/R/correlation.R index 5e9694c4..e86ad373 100644 --- a/R/correlation.R +++ b/R/correlation.R @@ -99,7 +99,7 @@ epi_cor <- function(x, var1, var2, dt1 = 0, dt2 = 0, shift_by = geo_value, # nol shift_by <- syms(names(eval_select(enquo(shift_by), x))) # Which method? - method <- match.arg(method) + method <- rlang::arg_match(method) # Perform time shifts, then compute appropriate correlations and return return(x %>% diff --git a/R/growth_rate.R b/R/growth_rate.R index 4537375d..d8264fd2 100644 --- a/R/growth_rate.R +++ b/R/growth_rate.R @@ -120,7 +120,7 @@ growth_rate <- function(x = seq_along(y), y, x0 = x, # Check x, y, x0 if (length(x) != length(y)) cli_abort("`x` and `y` must have the same length.") if (!all(x0 %in% x)) cli_abort("`x0` must be a subset of `x`.") - method <- match.arg(method) + method <- rlang::arg_match(method) # Arrange in increasing order of x o <- order(x) diff --git a/R/outliers.R b/R/outliers.R index 3d0ff5e5..8be492dd 100644 --- a/R/outliers.R +++ b/R/outliers.R @@ -89,7 +89,7 @@ detect_outlr <- function(x = seq_along(y), y, ), combiner = c("median", "mean", "none")) { # Validate combiner - combiner <- match.arg(combiner) + combiner <- rlang::arg_match(combiner) # Validate that x contains all distinct values if (any(duplicated(x))) { @@ -189,7 +189,7 @@ detect_outlr_rm <- function(x = seq_along(y), y, n = 21, # Calculate lower and upper thresholds and replacement value z <- z %>% - epi_slide(fitted = median(y), before = floor((n - 1) / 2), after = ceiling((n - 1) / 2)) %>% + epi_slide(fitted = median(y), .window_size = n, .align = "center") %>% dplyr::mutate(resid = y - fitted) %>% roll_iqr( n = n, @@ -360,8 +360,7 @@ roll_iqr <- function(z, n, detection_multiplier, min_radius, z %>% epi_slide( roll_iqr = stats::IQR(resid), - before = floor((n - 1) / 2), - after = ceiling((n - 1) / 2) + .window_size = n, .align = "center" ) %>% dplyr::mutate( lower = pmax( diff --git a/R/slide.R b/R/slide.R index c27d7cea..91cebd2b 100644 --- a/R/slide.R +++ b/R/slide.R @@ -5,31 +5,29 @@ #' for examples. #' #' @template basic-slide-params -#' @param f Function, formula, or missing; together with `...` specifies the +#' @param .f Function, formula, or missing; together with `...` specifies the #' computation to slide. To "slide" means to apply a computation within a #' sliding (a.k.a. "rolling") time window for each data group. The window is #' determined by the `before` and `after` parameters described below. One time #' step is typically one day or one week; see details for more explanation. If -#' a function, `f` must take a data frame with the same column names as -#' the original object, minus any grouping variables, containing the time -#' window data for one group-`ref_time_value` combination; followed by a -#' one-row tibble containing the values of the grouping variables for the -#' associated group; followed by any number of named arguments. If a formula, -#' `f` can operate directly on columns accessed via `.x$var` or `.$var`, as -#' in `~mean(.x$var)` to compute a mean of a column `var` for each +#' a function, `.f` must take a data frame with the same column names as the +#' original object, minus any grouping variables, containing the time window +#' data for one group-`.ref_time_value` combination; followed by a one-row +#' tibble containing the values of the grouping variables for the associated +#' group; followed by any number of named arguments. If a formula, `.f` can +#' operate directly on columns accessed via `.x$var` or `.$var`, as in +#' `~mean(.x$var)` to compute a mean of a column `var` for each #' `ref_time_value`-group combination. The group key can be accessed via `.y`. -#' If `f` is missing, then `...` will specify the computation. +#' If `.f` is missing, then `...` will specify the computation. #' @param ... Additional arguments to pass to the function or formula specified -#' via `f`. Alternatively, if `f` is missing, then the `...` is interpreted as -#' a ["data-masking"][rlang::args_data_masking] expression or expressions for -#' tidy evaluation; in addition to referring columns directly by name, the +#' via `.f`. Alternatively, if `.f` is missing, then the `...` is interpreted +#' as a ["data-masking"][rlang::args_data_masking] expression or expressions +#' for tidy evaluation; in addition to referring columns directly by name, the #' expressions have access to `.data` and `.env` pronouns as in `dplyr` verbs, #' and can also refer to `.x`, `.group_key`, and `.ref_time_value`. See #' details. -#' @param new_col_name String indicating the name of the new column that will -#' contain the derivative values. The default is "slide_value" unless your -#' slide computations output data frames, in which case they will be unpacked -#' into the constituent columns and those names used. Note that setting +#' @param .new_col_name String indicating the name of the new column that will +#' contain the derivative values. Default is "slide_value"; note that setting #' `new_col_name` equal to an existing column name will overwrite this column. #' #' @template basic-slide-details @@ -45,32 +43,28 @@ #' # the `epi_slide_mean` and `epi_slide_sum` functions instead. #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide(cases_7dav = mean(cases), before = 6) %>% -#' # Remove a nonessential var. to ensure new col is printed +#' epi_slide(cases_7dav = mean(cases), .window_size = 7) %>% #' dplyr::select(geo_value, time_value, cases, cases_7dav) %>% #' ungroup() #' #' # slide a 7-day leading average #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide(cases_7dav = mean(cases), after = 6) %>% -#' # Remove a nonessential var. to ensure new col is printed +#' epi_slide(cases_7dav = mean(cases), .window_size = 7, .align = "left") %>% #' dplyr::select(geo_value, time_value, cases, cases_7dav) %>% #' ungroup() #' #' # slide a 7-day centre-aligned average #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide(cases_7dav = mean(cases), before = 3, after = 3) %>% -#' # Remove a nonessential var. to ensure new col is printed +#' epi_slide(cases_7dav = mean(cases), .window_size = 7, .align = "center") %>% #' dplyr::select(geo_value, time_value, cases, cases_7dav) %>% #' ungroup() #' #' # slide a 14-day centre-aligned average #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide(cases_14dav = mean(cases), before = 6, after = 7) %>% -#' # Remove a nonessential var. to ensure new col is printed +#' epi_slide(cases_14dav = mean(cases), .window_size = 14, .align = "center") %>% #' dplyr::select(geo_value, time_value, cases, cases_14dav) %>% #' ungroup() #' @@ -78,80 +72,119 @@ #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% #' epi_slide( -#' a = data.frame( +#' cases_2d = list(data.frame( #' cases_2dav = mean(cases), #' cases_2dma = mad(cases) -#' ), -#' before = 1, as_list_col = TRUE +#' )), +#' .window_size = 2 #' ) %>% #' ungroup() -epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = NULL, - new_col_name = NULL, all_rows = FALSE, - as_list_col = deprecated(), names_sep = deprecated()) { - assert_class(x, "epi_df") +epi_slide <- function( + .x, .f, ..., + .window_size = 1, .align = c("right", "center", "left"), + .ref_time_values = NULL, .new_col_name = NULL, .all_rows = FALSE) { + # Argument deprecation handling + provided_args <- rlang::call_args_names(rlang::call_match()) + if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "f", "ref_time_values", "new_col_name", "all_rows")))) { + cli::cli_abort( + "epi_slide: you are using one of the following old argument names: `x`, `f`, `ref_time_values`, + `new_col_name`, or `all_rows`. Please use the new dot-prefixed names: `.x`, `.f`, `.ref_time_values`, + `.new_col_name`, `.all_rows`." + ) + } + if ("as_list_col" %in% provided_args) { + cli::cli_abort( + "epi_slide: the argument `as_list_col` is deprecated. If FALSE, you can just remove it. + If TRUE, have your given computation wrap its result using `list(result)` instead." + ) + } + if ("names_sep" %in% provided_args) { + cli::cli_abort( + "epi_slide: the argument `names_sep` is deprecated. If NULL, you can remove it, it is now default. + If a string, please manually prefix your column names instead." + ) + } + if ("before" %in% provided_args || "after" %in% provided_args) { + cli::cli_abort( + "epi_slide: `before` and `after` are deprecated for `epi_slide`. Use `.window_size` and `.align` instead. + See the slide documentation for more details." + ) + } + + # Function body starts + assert_class(.x, "epi_df") - if (nrow(x) == 0L) { - return(x) + if (nrow(.x) == 0L) { + return(.x) } - if (is.null(ref_time_values)) { - ref_time_values <- unique(x$time_value) + if (is.null(.ref_time_values)) { + .ref_time_values <- unique(.x$time_value) } else { - assert_numeric(ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) - if (!test_subset(ref_time_values, unique(x$time_value))) { + assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) + if (!test_subset(.ref_time_values, unique(.x$time_value))) { cli_abort( "`ref_time_values` must be a unique subset of the time values in `x`.", class = "epi_slide__invalid_ref_time_values" ) } - if (anyDuplicated(ref_time_values) != 0L) { + + if (anyDuplicated(.ref_time_values) != 0L) { cli_abort( - "`ref_time_values` must not contain any duplicates; use `unique` if appropriate.", + "`.ref_time_values` must not contain any duplicates; use `unique` if appropriate.", class = "epi_slide__invalid_ref_time_values" ) } } - ref_time_values <- sort(ref_time_values) - - # Handle defaults for before/after - time_type <- attr(x, "metadata")$time_type - if (is.null(before) && !is.null(after)) { - if (inherits(after, "difftime")) { - before <- as.difftime(0, units = units(after)) - } else { - before <- 0 - } - } - if (is.null(after) && !is.null(before)) { - if (inherits(before, "difftime")) { - after <- as.difftime(0, units = units(before)) - } else { - if (identical(before, Inf) && time_type %in% c("day", "week")) { + .ref_time_values <- sort(.ref_time_values) + + # Handle window arguments + align <- rlang::arg_match(.align) + time_type <- attr(.x, "metadata")$time_type + validate_slide_window_arg(.window_size, time_type) + if (identical(.window_size, Inf)) { + if (align == "right") { + before <- Inf + if (time_type %in% c("day", "week")) { after <- as.difftime(0, units = glue::glue("{time_type}s")) } else { after <- 0 } + } else { + cli_abort( + "`epi_slide`: center and left alignment are not supported with an infinite window size." + ) + } + } else { + if (align == "right") { + before <- .window_size - 1 + after <- 0 + } else if (align == "center") { + # For .window_size = 5, before = 2, after = 2. For .window_size = 4, before = 2, after = 1. + before <- floor(.window_size / 2) + after <- .window_size - before - 1 + } else if (align == "left") { + before <- 0 + after <- .window_size - 1 } } - validate_slide_window_arg(before, time_type) - validate_slide_window_arg(after, time_type, allow_inf = FALSE) # Arrange by increasing time_value - x <- arrange(x, .data$time_value) + x <- arrange(.x, .data$time_value) # Now set up starts and stops for sliding/hopping - starts <- ref_time_values - before - stops <- ref_time_values + after + starts <- .ref_time_values - before + stops <- .ref_time_values + after # If `f` is missing, interpret ... as an expression for tidy evaluation - if (missing(f)) { + if (missing(.f)) { used_data_masking <- TRUE quosures <- enquos(...) if (length(quosures) == 0) { cli_abort("If `f` is missing then a computation must be specified via `...`.") } - f <- quosures + .f <- quosures # Magic value that passes zero args as dots in calls below. Equivalent to # `... <- missing_arg()`, but use `assign` to avoid warning about # improper use of dots. @@ -160,51 +193,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = used_data_masking <- FALSE } - f <- as_slide_computation(f, ...) - - if (lifecycle::is_present(as_list_col)) { - if (!as_list_col) { - lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "You can simply remove as_list_col = FALSE.") # nolint: line_length_linter - } else { - lifecycle::deprecate_warn("0.8.1", "epi_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless the `epi_slide()` row-recycling behavior would be inappropriate. Attempting to mimic the effects of such a rewrite, but you may see changes in behavior...") # nolint: line_length_linter - f_orig <- f - if (!used_data_masking) { - f <- function(...) { - list(f_orig(...)) - } - } else { - f <- function(...) { - # tidyeval pre-as_list_col-deprecation only supported a single, named, - # data-masking expr. So we should have a single column which is a packed - # data.frame, or a non-data.frame. - wrapped_result_orig <- f_orig(...) - if (length(wrapped_result_orig) != 1L) { - cli_abort("Failed to rewrite `as_list_col = TRUE`, which is deprecated: an internal bug was encountered. Please remove `as_list_col = TRUE` and update your slide computation instead.") # nolint: line_length_linter - } - name_orig <- names(wrapped_result_orig)[[1L]] - result_orig <- wrapped_result_orig[[1L]] - if (is.data.frame(result_orig)) { - # to list of rows: - result_col <- lapply(seq_len(nrow(result_orig)), function(subresult_i) { - result_orig[subresult_i, ] - }) - results_lst <- list(result_col) - } else { - results_lst <- as.list(result_orig) - } - validate_tibble(new_tibble(`names<-`(results_lst, name_orig))) - } - } - } - } - - if (lifecycle::is_present(names_sep)) { - if (is.null(names_sep)) { - lifecycle::deprecate_warn("0.8.1", "epi_slide(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") # nolint: line_length_linter - } else { - lifecycle::deprecate_stop("0.8.1", "epi_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") # nolint: line_length_linter - } - } + f <- as_slide_computation(.f, ...) # Create a wrapper that calculates and passes `.ref_time_value` to the # computation. `i` is contained in the `f_wrapper_factory` environment such @@ -282,6 +271,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = slide_values <- vctrs::list_unchop(slide_values_list) + if ( all(purrr::map_int(slide_values_list, vctrs::vec_size) == 1L) && length(slide_values_list) != 0L @@ -333,16 +323,18 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = f_factory = f_wrapper_factory, starts = starts, stops = stops, - ref_time_values = ref_time_values, - all_rows = all_rows, - new_col_name = new_col_name, + ref_time_values = .ref_time_values, + all_rows = .all_rows, + new_col_name = .new_col_name, .keep = FALSE ) + return(x) } -#' Optimized slide function for performing common rolling computations on an `epi_df` object +#' Optimized slide function for performing common rolling computations on an +#' `epi_df` object #' #' Slides an n-timestep [data.table::froll] or [slider::summary-slide] function #' over variables in an `epi_df` object. See the @@ -351,30 +343,22 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' #' @template basic-slide-params #' @template opt-slide-params -#' @param f Function; together with `...` specifies the computation to slide. -#' `f` must be one of `data.table`'s rolling functions +#' @param .f Function; together with `...` specifies the computation to slide. +#' `.f` must be one of `data.table`'s rolling functions #' (`frollmean`, `frollsum`, `frollapply`. See [data.table::roll]) or one #' of `slider`'s specialized sliding functions (`slide_mean`, `slide_sum`, -#' etc. See [slider::summary-slide]). To "slide" means to apply a -#' computation within a sliding (a.k.a. "rolling") time window for each data -#' group. The window is determined by the `before` and `after` parameters -#' described below. One time step is typically one day or one week; see -#' details for more explanation. +#' etc. See [slider::summary-slide]). #' #' The optimized `data.table` and `slider` functions can't be directly passed -#' as the computation function in `epi_slide` without careful handling to -#' make sure each computation group is made up of the `n` dates rather than -#' `n` points. `epi_slide_opt` (and wrapper functions `epi_slide_mean` and -#' `epi_slide_sum`) take care of window completion automatically to prevent -#' associated errors. -#' @param ... Additional arguments to pass to the slide computation `f`, for -#' example, `na.rm` and `algo` if `f` is a `data.table` function. If `f` is -#' a `data.table` function, it is automatically passed the data `x` to -#' operate on, the window size `n`, and the alignment `align`. Providing -#' these args via `...` will cause an error. If `f` is a `slider` function, -#' it is automatically passed the data `x` to operate on, and number of -#' points `before` and `after` to use in the computation. -#' +#' as the computation function in `epi_slide` without careful handling to make +#' sure each computation group is made up of the `.window_size` dates rather +#' than `.window_size` points. `epi_slide_opt` (and wrapper functions +#' `epi_slide_mean` and `epi_slide_sum`) take care of window completion +#' automatically to prevent associated errors. +#' @param ... Additional arguments to pass to the slide computation `.f`, for +#' example, `algo` or `na.rm` in data.table functions. You don't need to +#' specify `.x`, `.window_size`, or `.align` (or `before`/`after` for slider +#' functions). #' @template opt-slide-details #' #' @importFrom dplyr bind_rows mutate %>% arrange tibble select all_of @@ -393,7 +377,7 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' group_by(geo_value) %>% #' epi_slide_opt( #' cases, -#' f = data.table::frollmean, before = 6 +#' .f = data.table::frollmean, .window_size = 7 #' ) %>% #' # Remove a nonessential var. to ensure new col is printed, and rename new col #' dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) %>% @@ -405,9 +389,9 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' group_by(geo_value) %>% #' epi_slide_opt( #' cases, -#' f = data.table::frollmean, before = 6, +#' .f = data.table::frollmean, .window_size = 7, #' # `frollmean` options -#' na.rm = TRUE, algo = "exact", hasNA = TRUE +#' algo = "exact", hasNA = TRUE, na.rm = TRUE #' ) %>% #' dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) %>% #' ungroup() @@ -417,60 +401,73 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values = #' group_by(geo_value) %>% #' epi_slide_opt( #' cases, -#' f = slider::slide_mean, after = 6 +#' .f = slider::slide_mean, .window_size = 7, .align = "left" #' ) %>% #' # Remove a nonessential var. to ensure new col is printed #' dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) %>% #' ungroup() #' -#' # slide a 7-day centre-aligned sum. This can also be done with `epi_slide_sum` +#' # slide a 7-day center-aligned sum. This can also be done with `epi_slide_sum` #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% #' epi_slide_opt( #' cases, -#' f = data.table::frollsum, before = 3, after = 3 +#' .f = data.table::frollsum, .window_size = 6, .align = "center" #' ) %>% #' # Remove a nonessential var. to ensure new col is printed #' dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) %>% #' ungroup() -epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref_time_values = NULL, - new_col_name = NULL, all_rows = FALSE, - as_list_col = deprecated(), names_sep = NULL) { - assert_class(x, "epi_df") - - if (nrow(x) == 0L) { - cli_abort( - c( - "input data `x` unexpectedly has 0 rows", - "i" = "If this computation is occuring within an `epix_slide` call, - check that `epix_slide` `ref_time_values` argument was set appropriately" - ), - class = "epiprocess__epi_slide_opt__0_row_input", - epiprocess__x = x +epi_slide_opt <- function( + .x, .col_names, .f, ..., + .window_size = 0, .align = c("right", "center", "left"), + .ref_time_values = NULL, .all_rows = FALSE) { + assert_class(.x, "epi_df") + + # Argument deprecation handling + provided_args <- rlang::call_args_names(rlang::call_match()) + if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "col_names", "f", "ref_time_values", "all_rows")))) { + cli::cli_abort( + "epi_slide_opt: you are using one of the following old argument names: `x`, `col_names`, `f`, `ref_time_values`, + or `all_rows`. Please use the new dot-prefixed names: `.x`, `.col_names`, `.f`, + `.ref_time_values`, `.all_rows`." ) } - - if (!is.null(new_col_name)) { - cli_abort( - c( - "`new_col_name` is not supported for `epi_slide_[opt/mean/sum]`", - "i" = "If you want to customize the output column names, use [`dplyr::rename`] after the slide." - ), + if ("as_list_col" %in% provided_args) { + cli::cli_abort( + "epi_slide_opt: the argument `as_list_col` is deprecated. If FALSE, you can just remove it. + If TRUE, have your given computation wrap its result using `list(result)` instead." + ) + } + if ("before" %in% provided_args || "after" %in% provided_args) { + cli::cli_abort( + "epi_slide_opt: `before` and `after` are deprecated for `epi_slide`. Use `.window_size` and `.align` instead. + See the slide documentation for more details." + ) + } + if ("new_col_name" %in% provided_args || ".new_col_name" %in% provided_args) { + cli::cli_abort( + "epi_slide_opt: the argument `new_col_name` is not supported for `epi_slide_opt`. If you want to customize + the output column names, use `dplyr::rename` after the slide.", class = "epiprocess__epi_slide_opt__new_name_not_supported" ) } - - if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_stop("0.8.1", "epi_slide_opt(as_list_col =)") + if ("names_sep" %in% provided_args || ".names_sep" %in% provided_args) { + cli::cli_abort( + "epi_slide_opt: the argument `names_sep` is not supported for `epi_slide_opt`. If you want to customize + the output column names, use `dplyr::rename` after the slide.", + class = "epiprocess__epi_slide_opt__name_sep_not_supported" + ) } - if (!is.null(names_sep)) { + if (nrow(.x) == 0L) { cli_abort( c( - "`names_sep` is not supported for `epi_slide_[opt/mean/sum]`", - "i" = "If you want to customize the output column names, use [`dplyr::rename`] after the slide." + "input data `x` unexpectedly has 0 rows", + "i" = "If this computation is occuring within an `epix_slide` call, + check that `epix_slide` `ref_time_values` argument was set appropriately" ), - class = "epiprocess__epi_slide_opt__name_sep_not_supported" + class = "epiprocess__epi_slide_opt__0_row_input", + epiprocess__x = .x ) } @@ -480,16 +477,12 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref # locally). if (any(map_lgl( list(frollmean, frollsum, frollapply), - function(roll_fn) { - identical(f, roll_fn) - } + ~ identical(.f, .x) ))) { f_from_package <- "data.table" } else if (any(map_lgl( list(slide_sum, slide_prod, slide_mean, slide_min, slide_max, slide_all, slide_any), - function(roll_fn) { - identical(f, roll_fn) - } + ~ identical(.f, .x) ))) { f_from_package <- "slider" } else { @@ -503,55 +496,71 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref etc. See `?slider::\`summary-slide\`` for more options)." ), class = "epiprocess__epi_slide_opt__unsupported_slide_function", - epiprocess__f = f + epiprocess__f = .f ) } - user_provided_rtvs <- !is.null(ref_time_values) + user_provided_rtvs <- !is.null(.ref_time_values) if (!user_provided_rtvs) { - ref_time_values <- unique(x$time_value) + .ref_time_values <- unique(.x$time_value) } else { - assert_numeric(ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) - if (!test_subset(ref_time_values, unique(x$time_value))) { + assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) + if (!test_subset(.ref_time_values, unique(.x$time_value))) { cli_abort( "`ref_time_values` must be a unique subset of the time values in `x`.", class = "epi_slide_opt__invalid_ref_time_values" ) } - if (anyDuplicated(ref_time_values) != 0L) { + if (anyDuplicated(.ref_time_values) != 0L) { cli_abort( "`ref_time_values` must not contain any duplicates; use `unique` if appropriate.", class = "epi_slide_opt__invalid_ref_time_values" ) } } - ref_time_values <- sort(ref_time_values) - - # Handle defaults for before/after - time_type <- attr(x, "metadata")$time_type - if (is.null(before) && !is.null(after)) { - if (inherits(after, "difftime")) { - before <- as.difftime(0, units = units(after)) + ref_time_values <- sort(.ref_time_values) + + # Handle window arguments + align <- rlang::arg_match(.align) + time_type <- attr(.x, "metadata")$time_type + validate_slide_window_arg(.window_size, time_type) + if (identical(.window_size, Inf)) { + if (align == "right") { + before <- Inf + if (time_type %in% c("day", "week")) { + after <- as.difftime(0, units = glue::glue("{time_type}s")) + } else { + after <- 0 + } } else { - before <- 0 + cli_abort( + "`epi_slide`: center and left alignment are not supported with an infinite window size." + ) } - } - if (is.null(after) && !is.null(before)) { - if (inherits(before, "difftime")) { - after <- as.difftime(0, units = units(before)) - } else { - if (identical(before, Inf) && time_type %in% c("day", "week")) { + } else { + if (align == "right") { + before <- .window_size - 1 + if (time_type %in% c("day", "week")) { after <- as.difftime(0, units = glue::glue("{time_type}s")) } else { after <- 0 } + } else if (align == "center") { + # For .window_size = 5, before = 2, after = 2. For .window_size = 4, before = 2, after = 1. + before <- floor(.window_size / 2) + after <- .window_size - before - 1 + } else if (align == "left") { + if (time_type %in% c("day", "week")) { + before <- as.difftime(0, units = glue::glue("{time_type}s")) + } else { + before <- 0 + } + after <- .window_size - 1 } } - validate_slide_window_arg(before, time_type) - validate_slide_window_arg(after, time_type, allow_inf = FALSE) # Make a complete date sequence between min(x$time_value) and max(x$time_value). - date_seq_list <- full_date_seq(x, before, after, time_type) + date_seq_list <- full_date_seq(.x, before, after, time_type) all_dates <- date_seq_list$all_dates pad_early_dates <- date_seq_list$pad_early_dates pad_late_dates <- date_seq_list$pad_late_dates @@ -562,12 +571,12 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref # positions of user-provided `col_names` into string column names. We avoid # using `names(pos)` directly for robustness and in case we later want to # allow users to rename fields via tidyselection. - if (class(quo_get_expr(enquo(col_names))) == "character") { - pos <- eval_select(all_of(col_names), data = x, allow_rename = FALSE) + if (class(quo_get_expr(enquo(.col_names))) == "character") { + pos <- eval_select(dplyr::all_of(.col_names), data = .x, allow_rename = FALSE) } else { - pos <- eval_select(enquo(col_names), data = x, allow_rename = FALSE) + pos <- eval_select(enquo(.col_names), data = .x, allow_rename = FALSE) } - col_names_chr <- names(x)[pos] + col_names_chr <- names(.x)[pos] # Always rename results to "slide_value_". result_col_names <- paste0("slide_value_", col_names_chr) slide_one_grp <- function(.data_group, .group_key, ...) { @@ -622,10 +631,10 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref # be; shift results to the left by `after` timesteps. if (before != Inf) { window_size <- before + after + 1L - roll_output <- f(x = .data_group[, col_names_chr], n = window_size, ...) + roll_output <- .f(x = .data_group[, col_names_chr], n = window_size, ...) } else { window_size <- list(seq_along(.data_group$time_value)) - roll_output <- f(x = .data_group[, col_names_chr], n = window_size, adaptive = TRUE, ...) + roll_output <- .f(x = .data_group[, col_names_chr], n = window_size, adaptive = TRUE, ...) } if (after >= 1) { .data_group[, result_col_names] <- purrr::map(roll_output, function(.x) { @@ -637,7 +646,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref } if (f_from_package == "slider") { for (i in seq_along(col_names_chr)) { - .data_group[, result_col_names[i]] <- f( + .data_group[, result_col_names[i]] <- .f( x = .data_group[[col_names_chr[i]]], before = as.numeric(before), after = as.numeric(after), @@ -649,13 +658,13 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref return(.data_group) } - result <- mutate(x, .real = TRUE) %>% + result <- mutate(.x, .real = TRUE) %>% group_modify(slide_one_grp, ..., .keep = FALSE) result <- result[result$.real, ] result$.real <- NULL - if (all_rows) { + if (.all_rows) { result[!(result$time_value %in% ref_time_values), result_col_names] <- NA } else if (user_provided_rtvs) { result <- result[result$time_value %in% ref_time_values, ] @@ -664,7 +673,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref if (!is_epi_df(result)) { # `all_rows`handling strips epi_df format and metadata. # Restore them. - result <- reclass(result, attributes(x)$metadata) + result <- reclass(result, attributes(.x)$metadata) } return(result) @@ -676,14 +685,14 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' vignette](https://cmu-delphi.github.io/epiprocess/articles/slide.html) for #' examples. #' -#' Wrapper around `epi_slide_opt` with `f = datatable::frollmean`. +#' Wrapper around `epi_slide_opt` with `.f = datatable::frollmean`. #' #' @template basic-slide-params #' @template opt-slide-params -#' @param ... Additional arguments to pass to `data.table::frollmean`, for -#' example, `na.rm` and `algo`. `data.table::frollmean` is automatically -#' passed the data `x` to operate on, the window size `n`, and the alignment -#' `align`. Providing these args via `...` will cause an error. +#' @param ... Additional arguments to pass to the slide computation `.f`, for +#' example, `algo` or `na.rm` in data.table functions. You don't need to +#' specify `.x`, `.window_size`, or `.align` (or `before`/`after` for slider +#' functions). #' #' @template opt-slide-details #' @@ -693,7 +702,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' # slide a 7-day trailing average formula on cases #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide_mean(cases, before = 6) %>% +#' epi_slide_mean(cases, .window_size = 7) %>% #' # Remove a nonessential var. to ensure new col is printed #' dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) %>% #' ungroup() @@ -704,7 +713,7 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' group_by(geo_value) %>% #' epi_slide_mean( #' cases, -#' before = 6, +#' .window_size = 7, #' # `frollmean` options #' na.rm = TRUE, algo = "exact", hasNA = TRUE #' ) %>% @@ -714,41 +723,79 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref #' # slide a 7-day leading average #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide_mean(cases, after = 6) %>% +#' epi_slide_mean(cases, .window_size = 7, .align = "right") %>% #' # Remove a nonessential var. to ensure new col is printed #' dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) %>% #' ungroup() #' -#' # slide a 7-day centre-aligned average +#' # slide a 7-day center-aligned average #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide_mean(cases, before = 3, after = 3) %>% +#' epi_slide_mean(cases, .window_size = 7, .align = "center") %>% #' # Remove a nonessential var. to ensure new col is printed #' dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) %>% #' ungroup() #' -#' # slide a 14-day centre-aligned average +#' # slide a 14-day center-aligned average #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide_mean(cases, before = 6, after = 7) %>% +#' epi_slide_mean(cases, .window_size = 14, .align = "center") %>% #' # Remove a nonessential var. to ensure new col is printed #' dplyr::select(geo_value, time_value, cases, cases_14dav = slide_value_cases) %>% #' ungroup() -epi_slide_mean <- function(x, col_names, ..., before = NULL, after = NULL, ref_time_values = NULL, - new_col_name = NULL, all_rows = FALSE, - as_list_col = deprecated(), names_sep = NULL) { +epi_slide_mean <- function( + .x, .col_names, ..., + .window_size = 0, .align = c("right", "center", "left"), + .ref_time_values = NULL, .all_rows = FALSE) { + # Argument deprecation handling + provided_args <- rlang::call_args_names(rlang::call_match()) + if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "col_names", "f", "ref_time_values", "all_rows")))) { + cli::cli_abort( + "epi_slide_mean: you are using one of the following old argument names: `x`, `col_names`, `f`, `ref_time_values`, + or `all_rows`. Please use the new dot-prefixed names: `.x`, `.col_names`, `.f`, + `.ref_time_values`, `.all_rows`." + ) + } + if ("as_list_col" %in% provided_args) { + cli::cli_abort( + "epi_slide_mean: the argument `as_list_col` is deprecated. If FALSE, you can just remove it. + If TRUE, have your given computation wrap its result using `list(result)` instead." + ) + } + if ("names_sep" %in% provided_args) { + cli::cli_abort( + "epi_slide_mean: the argument `names_sep` is deprecated. If NULL, you can remove it, it is now default. + If a string, please manually prefix your column names instead." + ) + } + if ("before" %in% provided_args || "after" %in% provided_args) { + cli::cli_abort( + "epi_slide_mean: `before` and `after` are deprecated for `epi_slide`. Use `.window_size` and `.align` instead. + See the slide documentation for more details." + ) + } + if ("new_col_name" %in% provided_args || ".new_col_name" %in% provided_args) { + cli::cli_abort( + "epi_slide_mean: the argument `new_col_name` is not supported. If you want to customize + the output column names, use `dplyr::rename` after the slide." + ) + } + if ("names_sep" %in% provided_args || ".names_sep" %in% provided_args) { + cli::cli_abort( + "epi_slide_mean: the argument `names_sep` is not supported. If you want to customize + the output column names, use `dplyr::rename` after the slide." + ) + } + epi_slide_opt( - x = x, - col_names = {{ col_names }}, - f = data.table::frollmean, + .x = .x, + .col_names = {{ .col_names }}, + .f = data.table::frollmean, ..., - before = before, - after = after, - ref_time_values = ref_time_values, - new_col_name = new_col_name, - as_list_col = as_list_col, - names_sep = names_sep, - all_rows = all_rows + .window_size = .window_size, + .align = .align, + .ref_time_values = .ref_time_values, + .all_rows = .all_rows ) } @@ -758,14 +805,14 @@ epi_slide_mean <- function(x, col_names, ..., before = NULL, after = NULL, ref_t #' vignette](https://cmu-delphi.github.io/epiprocess/articles/slide.html) for #' examples. #' -#' Wrapper around `epi_slide_opt` with `f = datatable::frollsum`. +#' Wrapper around `epi_slide_opt` with `.f = datatable::frollsum`. #' #' @template basic-slide-params #' @template opt-slide-params -#' @param ... Additional arguments to pass to `data.table::frollsum`, for -#' example, `na.rm` and `algo`. `data.table::frollsum` is automatically -#' passed the data `x` to operate on, the window size `n`, and the alignment -#' `align`. Providing these args via `...` will cause an error. +#' @param ... Additional arguments to pass to the slide computation `.f`, for +#' example, `algo` or `na.rm` in data.table functions. You don't need to +#' specify `.x`, `.window_size`, or `.align` (or `before`/`after` for slider +#' functions). #' #' @template opt-slide-details #' @@ -775,27 +822,62 @@ epi_slide_mean <- function(x, col_names, ..., before = NULL, after = NULL, ref_t #' # slide a 7-day trailing sum formula on cases #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% -#' epi_slide_sum(cases, before = 6) %>% +#' epi_slide_sum(cases, .window_size = 7) %>% #' # Remove a nonessential var. to ensure new col is printed #' dplyr::select(geo_value, time_value, cases, cases_7dsum = slide_value_cases) %>% #' ungroup() -epi_slide_sum <- function(x, col_names, ..., before = NULL, after = NULL, ref_time_values = NULL, - new_col_name = NULL, - all_rows = FALSE, - as_list_col = deprecated(), - names_sep = NULL) { +epi_slide_sum <- function( + .x, .col_names, ..., + .window_size = 0, .align = c("right", "center", "left"), + .ref_time_values = NULL, .all_rows = FALSE) { + # Argument deprecation handling + provided_args <- rlang::call_args_names(rlang::call_match()) + if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "col_names", "f", "ref_time_values", "all_rows")))) { + cli::cli_abort( + "epi_slide_sum: you are using one of the following old argument names: `x`, `col_names`, `f`, `ref_time_values`, + or `all_rows`. Please use the new dot-prefixed names: `.x`, `.col_names`, `.f`, + `.ref_time_values`, `.all_rows`." + ) + } + if ("as_list_col" %in% provided_args) { + cli::cli_abort( + "epi_slide_sum: the argument `as_list_col` is deprecated. If FALSE, you can just remove it. + If TRUE, have your given computation wrap its result using `list(result)` instead." + ) + } + if ("names_sep" %in% provided_args) { + cli::cli_abort( + "epi_slide_sum: the argument `names_sep` is deprecated. If NULL, you can remove it, it is now default. + If a string, please manually prefix your column names instead." + ) + } + if ("before" %in% provided_args || "after" %in% provided_args) { + cli::cli_abort( + "epi_slide_sum: `before` and `after` are deprecated for `epi_slide`. Use `.window_size` and `.align` instead. + See the slide documentation for more details." + ) + } + if ("new_col_name" %in% provided_args || ".new_col_name" %in% provided_args) { + cli::cli_abort( + "epi_slide_sum: the argument `new_col_name` is not supported. If you want to customize + the output column names, use `dplyr::rename` after the slide." + ) + } + if ("names_sep" %in% provided_args || ".names_sep" %in% provided_args) { + cli::cli_abort( + "epi_slide_sum: the argument `names_sep` is not supported. If you want to customize + the output column names, use `dplyr::rename` after the slide." + ) + } epi_slide_opt( - x = x, - col_names = {{ col_names }}, - f = data.table::frollsum, + .x = .x, + .col_names = {{ .col_names }}, + .f = data.table::frollsum, ..., - before = before, - after = after, - ref_time_values = ref_time_values, - new_col_name = new_col_name, - as_list_col = as_list_col, - names_sep = names_sep, - all_rows = all_rows + .window_size = .window_size, + .align = .align, + .ref_time_values = .ref_time_values, + .all_rows = .all_rows ) } diff --git a/man-roxygen/basic-slide-details.R b/man-roxygen/basic-slide-details.R index 4f606311..64570976 100644 --- a/man-roxygen/basic-slide-details.R +++ b/man-roxygen/basic-slide-details.R @@ -1,39 +1,53 @@ #' @details To "slide" means to apply a function or formula over a rolling -#' window of time steps for each data group, where the window is centered at a -#' reference time and left and right endpoints are given by the `before` and -#' `after` arguments. -#' -#' If there are not enough time steps available to complete the window at any -#' given reference time, then `epi_slide()` still attempts to perform the -#' computation anyway (it does not require a complete window). The issue of -#' what to do with partial computations (those run on incomplete windows) is -#' therefore left up to the user, either through the specified function or -#' formula `f`, or through post-processing. For a centrally-aligned slide of -#' `n` `time_value`s in a sliding window, set `before = (n-1)/2` and `after = -#' (n-1)/2` when the number of `time_value`s in a sliding window is odd and -#' `before = n/2-1` and `after = n/2` when `n` is even. -#' -#' Sometimes, we want to experiment with various trailing or leading window -#' widths and compare the slide outputs. In the (uncommon) case where -#' zero-width windows are considered, manually pass both the `before` and -#' `after` arguments. -#' -#' If `f` is missing, then ["data-masking"][rlang::args_data_masking] +#' window. The `.window_size` arg determines the width of the window +#' (including the reference time) and the `.align` arg governs how the window +#' is aligned (see below for examples). The `.ref_time_values` arg controls +#' which time values to consider for the slide and `.all_rows` allows you to +#' keep NAs around. +#' +#' `epi_slide()` does not require a complete window (such as on the left +#' boundary of the dataset) and will attempt to perform the computation +#' anyway. The issue of what to do with partial computations (those run on +#' incomplete windows) is therefore left up to the user, either through the +#' specified function or formula `f`, or through post-processing. +#' +#' Let's look at some window examples, assuming that the reference time value +#' is "tv". With .align = "right" and .window_size = 3, the window will be: +#' +#' time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: tv - 2, tv - 1, tv +#' +#' With .align = "center" and .window_size = 3, the window will be: +#' +#' time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: tv - 1, tv, tv + 1 +#' +#' With .align = "center" and .window_size = 4, the window will be: +#' +#' time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: tv - 2, tv - 1, tv, tv + 1 +#' +#' With .align = "left" and .window_size = 3, the window will be: +#' +#' time_values: ttv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: tv, tv + 1, tv + 2 +#' +#' If `.f` is missing, then ["data-masking"][rlang::args_data_masking] #' expression(s) for tidy evaluation can be specified, for example, as in: #' ``` -#' epi_slide(x, cases_7dav = mean(cases), before = 6) +#' epi_slide(x, cases_7dav = mean(cases), .window_size = 7) #' ``` #' which would be equivalent to: #' ``` -#' epi_slide(x, function(x, g, t) mean(x$cases), before = 6, -#' new_col_name = "cases_7dav") +#' epi_slide(x, function(x, g, t) mean(x$cases), .window_size = 7, +#' .new_col_name = "cases_7dav") #' ``` #' In a manner similar to [`dplyr::mutate`]: #' * Expressions evaluating to length-1 vectors will be recycled to #' appropriate lengths. #' * `, name_var := value` can be used to set the output column name based on #' a variable `name_var` rather than requiring you to use a hard-coded -#' name. (The leading comma is needed to make sure that `f` is treated as +#' name. (The leading comma is needed to make sure that `.f` is treated as #' missing.) #' * `= NULL` can be used to remove results from previous expressions (though #' we don't allow it to remove pre-existing columns). @@ -51,5 +65,5 @@ #' won't let you refer to the output of the earlier expressions, but `.data` #' will. #' * .group_key, which is like `.y` in [`dplyr::group_modify`]. -#' * .ref_time_value, which is the element of `ref_time_values` that +#' * .ref_time_value, which is the element of `.ref_time_values` that #' determined the time window for the current computation. diff --git a/man-roxygen/basic-slide-params.R b/man-roxygen/basic-slide-params.R index f556f540..8a63a817 100644 --- a/man-roxygen/basic-slide-params.R +++ b/man-roxygen/basic-slide-params.R @@ -1,52 +1,35 @@ -#' @param x The `epi_df` object under consideration, [grouped][dplyr::group_by] -#' or ungrouped. If ungrouped, all data in `x` will be treated as part of a +#' @param .x The `epi_df` object under consideration, [grouped][dplyr::group_by] +#' or ungrouped. If ungrouped, all data in `.x` will be treated as part of a #' single data group. -#' @param before,after How far `before` and `after` each `ref_time_value` should -#' the sliding window extend? At least one of these two arguments must be -#' provided; the other's default will be 0. The accepted values for these -#' depend on the type of the `time_value` column: +#' @param .window_size The size of the sliding window. By default, this is 1, +#' meaning that only the current ref_time_value is included. The accepted values +#' here depend on the `time_value` column: #' -#' - if it is a Date and the cadence is daily, then they can be integers -#' (which will be interpreted in units of days) or difftimes with units -#' "days" -#' - if it is a Date and the cadence is weekly, then they must be difftimes -#' with units "weeks" -#' - if it is an integer, then they must be integers +#' - if time_type is Date and the cadence is daily, then `.window_size` can be +#' an integer (which will be interpreted in units of days) or a difftime +#' with units "days" +#' - if time_type is Date and the cadence is weekly, then `.window_size` must +#' be a difftime with units "weeks" +#' - if time_type is an integer, then `.window_size` must be an integer #' -#' Endpoints of the window are inclusive. Common settings: -#' -#' - For trailing/right-aligned windows from `ref_time_value - k` to -#' `ref_time_value`: either pass `before=k` by itself, or pass `before=k, -#' after=0`. -#' - For center-aligned windows from `ref_time_value - k` to -#' `ref_time_value + k`: pass `before=k, after=k`. -#' - For leading/left-aligned windows from `ref_time_value` to -#' `ref_time_value + k`: either pass pass `after=k` by itself, -#' or pass `before=0, after=k`. -#' -#' See "Details:" on how missing rows are handled within the window. -#' @param ref_time_values Time values for sliding computations, meaning, each +#' @param .align The alignment of the sliding window. If `right` (default), then +#' the window has its end at the reference time; if `center`, then the window is +#' centered at the reference time; if `left`, then the window has its start at +#' the reference time. If the alignment is `center` and the window size is odd, +#' then the window will have floor(window_size/2) points before and after the +#' reference time. If the window size is even, then the window will be +#' asymmetric and have one less value on the right side of the reference time +#' (assuming time increases from left to right). +#' @param .ref_time_values Time values for sliding computations, meaning, each #' element of this vector serves as the reference time point for one sliding #' window. If missing, then this will be set to all unique time values in the #' underlying data table, by default. -#' @param all_rows If `all_rows = TRUE`, then all rows of `x` will be kept in -#' the output even with `ref_time_values` provided, with some type of missing +#' @param .all_rows If `.all_rows = TRUE`, then all rows of `.x` will be kept in +#' the output even with `.ref_time_values` provided, with some type of missing #' value marker for the slide computation output column(s) for `time_value`s -#' outside `ref_time_values`; otherwise, there will be one row for each row in -#' `x` that had a `time_value` in `ref_time_values`. Default is `FALSE`. The +#' outside `.ref_time_values`; otherwise, there will be one row for each row in +#' `.x` that had a `time_value` in `.ref_time_values`. Default is `FALSE`. The #' missing value marker is the result of `vctrs::vec_cast`ing `NA` to the type -#' of the slide computation output. If using `as_list_col = TRUE`, note that -#' the missing marker is a `NULL` entry in the list column; for certain -#' operations, you might want to replace these `NULL` entries with a different -#' `NA` marker. -#' @param as_list_col `r lifecycle::badge("deprecated")` if you want a list -#' column as output, you can now just directly output a list from your slide -#' computations. Usually this just means wrapping your output in a length-1 -#' list (outputting `list(result)` instead of `result`). -#' @param names_sep `r lifecycle::badge("deprecated")` if you were specifying -#' `names_sep = NULL`, that's no longer needed. If you were using a non-NULL -#' value, you can either directly prefix your slide computation names, or -#' output a list and then later call `tidyr::unnest(slide_output, -#' , names_sep = )`. -#' @return An `epi_df` object given by appending one or more new columns to `x`, -#' named according to the `new_col_name` argument. +#' of the slide computation output. +#' @return An `epi_df` object given by appending one or more new columns to `.x`, +#' named according to the `.new_col_name` argument. diff --git a/man-roxygen/opt-slide-details.R b/man-roxygen/opt-slide-details.R index 5e8876d2..f78a33db 100644 --- a/man-roxygen/opt-slide-details.R +++ b/man-roxygen/opt-slide-details.R @@ -1,16 +1,33 @@ -#' @details To "slide" means to apply a function over a rolling window of time -#' steps for each data group, where the window is centered at a reference time -#' and left and right endpoints are given by the `before` and `after` -#' arguments. - -#' If there are not enough time steps available to complete the window at any -#' given reference time, then `epi_slide_*()` will fail; it requires a -#' complete window to perform the computation. For a centrally-aligned slide -#' of `n` `time_value`s in a sliding window, set `before = (n-1)/2` and `after -#' = (n-1)/2` when the number of `time_value`s in a sliding window is odd and -#' `before = n/2-1` and `after = n/2` when `n` is even. -#' -#' Sometimes, we want to experiment with various trailing or leading window -#' widths and compare the slide outputs. In the (uncommon) case where -#' zero-width windows are considered, manually pass both the `before` and -#' `after` arguments. +#' @details To "slide" means to apply a function or formula over a rolling +#' window. The `.window_size` arg determines the width of the window +#' (including the reference time) and the `.align` arg governs how the window +#' is aligned (see below for examples). The `.ref_time_values` arg controls +#' which time values to consider for the slide and `.all_rows` allows you to +#' keep NAs around. +#' +#' `epi_slide_*()` does not require a complete window (such as on the left +#' boundary of the dataset) and will attempt to perform the computation +#' anyway. The issue of what to do with partial computations (those run on +#' incomplete windows) is therefore left up to the user, either through the +#' specified function or formula `f`, or through post-processing. +#' +#' Let's look at some window examples, assuming that the reference time value +#' is `tv`. With .align = "right" and .window_size = 3, the window will be: +#' +#' time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: [tv - 2, tv - 1, tv] +#' +#' With .align = "center" and .window_size = 3, the window will be: +#' +#' time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: [tv - 1, tv, tv + 1] +#' +#' With .align = "center" and .window_size = 4, the window will be: +#' +#' time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: [tv - 2, tv - 1, tv, tv + 1] +#' +#' With .align = "left" and .window_size = 3, the window will be: +#' +#' time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: [tv, tv + 1, tv + 2] diff --git a/man-roxygen/opt-slide-params.R b/man-roxygen/opt-slide-params.R index 151b4f86..ba4b4877 100644 --- a/man-roxygen/opt-slide-params.R +++ b/man-roxygen/opt-slide-params.R @@ -1,4 +1,4 @@ -#' @param col_names <[`tidy-select`][dplyr_tidy_select]> An unquoted column +#' @param .col_names <[`tidy-select`][dplyr_tidy_select]> An unquoted column #' name(e.g., `cases`), multiple column names (e.g., `c(cases, deaths)`), #' [other tidy-select expression][tidyselect::language], or a vector of #' characters (e.g. `c("cases", "deaths")`). Variable names can be used as if @@ -8,6 +8,3 @@ #' The tidy-selection renaming interface is not supported, and cannot be used #' to provide output column names; if you want to customize the output column #' names, use [`dplyr::rename`] after the slide. -#' @param as_list_col Not supported. Included to match `epi_slide` interface. -#' @param new_col_name Not supported. Included to match `epi_slide` interface. -#' @param names_sep Not supported. Included to match `epi_slide` interface. diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index 9eea2442..fc675071 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -5,107 +5,85 @@ \title{Slide a function over variables in an \code{epi_df} object} \usage{ epi_slide( - x, - f, + .x, + .f, ..., - before = NULL, - after = NULL, - ref_time_values = NULL, - new_col_name = NULL, - all_rows = FALSE, - as_list_col = deprecated(), - names_sep = deprecated() + .window_size = 1, + .align = c("right", "center", "left"), + .ref_time_values = NULL, + .new_col_name = NULL, + .all_rows = FALSE ) } \arguments{ -\item{x}{The \code{epi_df} object under consideration, \link[dplyr:group_by]{grouped} -or ungrouped. If ungrouped, all data in \code{x} will be treated as part of a +\item{.x}{The \code{epi_df} object under consideration, \link[dplyr:group_by]{grouped} +or ungrouped. If ungrouped, all data in \code{.x} will be treated as part of a single data group.} -\item{f}{Function, formula, or missing; together with \code{...} specifies the +\item{.f}{Function, formula, or missing; together with \code{...} specifies the computation to slide. To "slide" means to apply a computation within a sliding (a.k.a. "rolling") time window for each data group. The window is determined by the \code{before} and \code{after} parameters described below. One time step is typically one day or one week; see details for more explanation. If -a function, \code{f} must take a data frame with the same column names as -the original object, minus any grouping variables, containing the time -window data for one group-\code{ref_time_value} combination; followed by a -one-row tibble containing the values of the grouping variables for the -associated group; followed by any number of named arguments. If a formula, -\code{f} can operate directly on columns accessed via \code{.x$var} or \code{.$var}, as -in \code{~mean(.x$var)} to compute a mean of a column \code{var} for each +a function, \code{.f} must take a data frame with the same column names as the +original object, minus any grouping variables, containing the time window +data for one group-\code{.ref_time_value} combination; followed by a one-row +tibble containing the values of the grouping variables for the associated +group; followed by any number of named arguments. If a formula, \code{.f} can +operate directly on columns accessed via \code{.x$var} or \code{.$var}, as in +\code{~mean(.x$var)} to compute a mean of a column \code{var} for each \code{ref_time_value}-group combination. The group key can be accessed via \code{.y}. -If \code{f} is missing, then \code{...} will specify the computation.} +If \code{.f} is missing, then \code{...} will specify the computation.} \item{...}{Additional arguments to pass to the function or formula specified -via \code{f}. Alternatively, if \code{f} is missing, then the \code{...} is interpreted as -a \link[rlang:args_data_masking]{"data-masking"} expression or expressions for -tidy evaluation; in addition to referring columns directly by name, the +via \code{.f}. Alternatively, if \code{.f} is missing, then the \code{...} is interpreted +as a \link[rlang:args_data_masking]{"data-masking"} expression or expressions +for tidy evaluation; in addition to referring columns directly by name, the expressions have access to \code{.data} and \code{.env} pronouns as in \code{dplyr} verbs, and can also refer to \code{.x}, \code{.group_key}, and \code{.ref_time_value}. See details.} -\item{before, after}{How far \code{before} and \code{after} each \code{ref_time_value} should -the sliding window extend? At least one of these two arguments must be -provided; the other's default will be 0. The accepted values for these -depend on the type of the \code{time_value} column: +\item{.window_size}{The size of the sliding window. By default, this is 1, +meaning that only the current ref_time_value is included. The accepted values +here depend on the \code{time_value} column: \itemize{ -\item if it is a Date and the cadence is daily, then they can be integers -(which will be interpreted in units of days) or difftimes with units -"days" -\item if it is a Date and the cadence is weekly, then they must be difftimes -with units "weeks" -\item if it is an integer, then they must be integers -} - -Endpoints of the window are inclusive. Common settings: -\itemize{ -\item For trailing/right-aligned windows from \code{ref_time_value - k} to -\code{ref_time_value}: either pass \code{before=k} by itself, or pass \verb{before=k, after=0}. -\item For center-aligned windows from \code{ref_time_value - k} to -\code{ref_time_value + k}: pass \verb{before=k, after=k}. -\item For leading/left-aligned windows from \code{ref_time_value} to -\code{ref_time_value + k}: either pass pass \code{after=k} by itself, -or pass \verb{before=0, after=k}. -} - -See "Details:" on how missing rows are handled within the window.} - -\item{ref_time_values}{Time values for sliding computations, meaning, each +\item if time_type is Date and the cadence is daily, then \code{.window_size} can be +an integer (which will be interpreted in units of days) or a difftime +with units "days" +\item if time_type is Date and the cadence is weekly, then \code{.window_size} must +be a difftime with units "weeks" +\item if time_type is an integer, then \code{.window_size} must be an integer +}} + +\item{.align}{The alignment of the sliding window. If \code{right} (default), then +the window has its end at the reference time; if \code{center}, then the window is +centered at the reference time; if \code{left}, then the window has its start at +the reference time. If the alignment is \code{center} and the window size is odd, +then the window will have floor(window_size/2) points before and after the +reference time. If the window size is even, then the window will be +asymmetric and have one less value on the right side of the reference time +(assuming time increases from left to right).} + +\item{.ref_time_values}{Time values for sliding computations, meaning, each element of this vector serves as the reference time point for one sliding window. If missing, then this will be set to all unique time values in the underlying data table, by default.} -\item{new_col_name}{String indicating the name of the new column that will -contain the derivative values. The default is "slide_value" unless your -slide computations output data frames, in which case they will be unpacked -into the constituent columns and those names used. Note that setting +\item{.new_col_name}{String indicating the name of the new column that will +contain the derivative values. Default is "slide_value"; note that setting \code{new_col_name} equal to an existing column name will overwrite this column.} -\item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in -the output even with \code{ref_time_values} provided, with some type of missing +\item{.all_rows}{If \code{.all_rows = TRUE}, then all rows of \code{.x} will be kept in +the output even with \code{.ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s -outside \code{ref_time_values}; otherwise, there will be one row for each row in -\code{x} that had a \code{time_value} in \code{ref_time_values}. Default is \code{FALSE}. The +outside \code{.ref_time_values}; otherwise, there will be one row for each row in +\code{.x} that had a \code{time_value} in \code{.ref_time_values}. Default is \code{FALSE}. The missing value marker is the result of \code{vctrs::vec_cast}ing \code{NA} to the type -of the slide computation output. If using \code{as_list_col = TRUE}, note that -the missing marker is a \code{NULL} entry in the list column; for certain -operations, you might want to replace these \code{NULL} entries with a different -\code{NA} marker.} - -\item{as_list_col}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you want a list -column as output, you can now just directly output a list from your slide -computations. Usually this just means wrapping your output in a length-1 -list (outputting \code{list(result)} instead of \code{result}).} - -\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying -\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL -value, you can either directly prefix your slide computation names, or -output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} +of the slide computation output.} } \value{ -An \code{epi_df} object given by appending one or more new columns to \code{x}, -named according to the \code{new_col_name} argument. +An \code{epi_df} object given by appending one or more new columns to \code{.x}, +named according to the \code{.new_col_name} argument. } \description{ Slides a given function over variables in an \code{epi_df} object. See the @@ -114,34 +92,49 @@ for examples. } \details{ To "slide" means to apply a function or formula over a rolling -window of time steps for each data group, where the window is centered at a -reference time and left and right endpoints are given by the \code{before} and -\code{after} arguments. - -If there are not enough time steps available to complete the window at any -given reference time, then \code{epi_slide()} still attempts to perform the -computation anyway (it does not require a complete window). The issue of -what to do with partial computations (those run on incomplete windows) is -therefore left up to the user, either through the specified function or -formula \code{f}, or through post-processing. For a centrally-aligned slide of -\code{n} \code{time_value}s in a sliding window, set \code{before = (n-1)/2} and \code{after = (n-1)/2} when the number of \code{time_value}s in a sliding window is odd and -\code{before = n/2-1} and \code{after = n/2} when \code{n} is even. - -Sometimes, we want to experiment with various trailing or leading window -widths and compare the slide outputs. In the (uncommon) case where -zero-width windows are considered, manually pass both the \code{before} and -\code{after} arguments. - -If \code{f} is missing, then \link[rlang:args_data_masking]{"data-masking"} +window. The \code{.window_size} arg determines the width of the window +(including the reference time) and the \code{.align} arg governs how the window +is aligned (see below for examples). The \code{.ref_time_values} arg controls +which time values to consider for the slide and \code{.all_rows} allows you to +keep NAs around. + +\code{epi_slide()} does not require a complete window (such as on the left +boundary of the dataset) and will attempt to perform the computation +anyway. The issue of what to do with partial computations (those run on +incomplete windows) is therefore left up to the user, either through the +specified function or formula \code{f}, or through post-processing. + +Let's look at some window examples, assuming that the reference time value +is "tv". With .align = "right" and .window_size = 3, the window will be: + +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 2, tv - 1, tv + +With .align = "center" and .window_size = 3, the window will be: + +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 1, tv, tv + 1 + +With .align = "center" and .window_size = 4, the window will be: + +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 2, tv - 1, tv, tv + 1 + +With .align = "left" and .window_size = 3, the window will be: + +time_values: ttv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv, tv + 1, tv + 2 + +If \code{.f} is missing, then \link[rlang:args_data_masking]{"data-masking"} expression(s) for tidy evaluation can be specified, for example, as in: -\if{html}{\out{
}}\preformatted{epi_slide(x, cases_7dav = mean(cases), before = 6) +\if{html}{\out{
}}\preformatted{epi_slide(x, cases_7dav = mean(cases), .window_size = 7) }\if{html}{\out{
}} which would be equivalent to: -\if{html}{\out{
}}\preformatted{epi_slide(x, function(x, g, t) mean(x$cases), before = 6, - new_col_name = "cases_7dav") +\if{html}{\out{
}}\preformatted{epi_slide(x, function(x, g, t) mean(x$cases), .window_size = 7, + .new_col_name = "cases_7dav") }\if{html}{\out{
}} In a manner similar to \code{\link[dplyr:mutate]{dplyr::mutate}}: @@ -150,7 +143,7 @@ In a manner similar to \code{\link[dplyr:mutate]{dplyr::mutate}}: appropriate lengths. \item \verb{, name_var := value} can be used to set the output column name based on a variable \code{name_var} rather than requiring you to use a hard-coded -name. (The leading comma is needed to make sure that \code{f} is treated as +name. (The leading comma is needed to make sure that \code{.f} is treated as missing.) \item \verb{= NULL} can be used to remove results from previous expressions (though we don't allow it to remove pre-existing columns). @@ -170,7 +163,7 @@ like \code{\link{.data}}; this allows you to use additional {dplyr}, {tidyr}, an won't let you refer to the output of the earlier expressions, but \code{.data} will. \item .group_key, which is like \code{.y} in \code{\link[dplyr:group_map]{dplyr::group_modify}}. -\item .ref_time_value, which is the element of \code{ref_time_values} that +\item .ref_time_value, which is the element of \code{.ref_time_values} that determined the time window for the current computation. } } @@ -180,32 +173,28 @@ determined the time window for the current computation. # the `epi_slide_mean` and `epi_slide_sum` functions instead. jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide(cases_7dav = mean(cases), before = 6) \%>\% - # Remove a nonessential var. to ensure new col is printed + epi_slide(cases_7dav = mean(cases), .window_size = 7) \%>\% dplyr::select(geo_value, time_value, cases, cases_7dav) \%>\% ungroup() # slide a 7-day leading average jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide(cases_7dav = mean(cases), after = 6) \%>\% - # Remove a nonessential var. to ensure new col is printed + epi_slide(cases_7dav = mean(cases), .window_size = 7, .align = "left") \%>\% dplyr::select(geo_value, time_value, cases, cases_7dav) \%>\% ungroup() # slide a 7-day centre-aligned average jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide(cases_7dav = mean(cases), before = 3, after = 3) \%>\% - # Remove a nonessential var. to ensure new col is printed + epi_slide(cases_7dav = mean(cases), .window_size = 7, .align = "center") \%>\% dplyr::select(geo_value, time_value, cases, cases_7dav) \%>\% ungroup() # slide a 14-day centre-aligned average jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide(cases_14dav = mean(cases), before = 6, after = 7) \%>\% - # Remove a nonessential var. to ensure new col is printed + epi_slide(cases_14dav = mean(cases), .window_size = 14, .align = "center") \%>\% dplyr::select(geo_value, time_value, cases, cases_14dav) \%>\% ungroup() @@ -213,11 +202,11 @@ jhu_csse_daily_subset \%>\% jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% epi_slide( - a = data.frame( + cases_2d = list(data.frame( cases_2dav = mean(cases), cases_2dma = mad(cases) - ), - before = 1, as_list_col = TRUE + )), + .window_size = 2 ) \%>\% ungroup() } diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index 55acad3c..3412f5a3 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -5,24 +5,21 @@ \title{Optimized slide function for performing rolling averages on an \code{epi_df} object} \usage{ epi_slide_mean( - x, - col_names, + .x, + .col_names, ..., - before = NULL, - after = NULL, - ref_time_values = NULL, - new_col_name = NULL, - all_rows = FALSE, - as_list_col = deprecated(), - names_sep = NULL + .window_size = 0, + .align = c("right", "center", "left"), + .ref_time_values = NULL, + .all_rows = FALSE ) } \arguments{ -\item{x}{The \code{epi_df} object under consideration, \link[dplyr:group_by]{grouped} -or ungrouped. If ungrouped, all data in \code{x} will be treated as part of a +\item{.x}{The \code{epi_df} object under consideration, \link[dplyr:group_by]{grouped} +or ungrouped. If ungrouped, all data in \code{.x} will be treated as part of a single data group.} -\item{col_names}{<\code{\link[=dplyr_tidy_select]{tidy-select}}> An unquoted column +\item{.col_names}{<\code{\link[=dplyr_tidy_select]{tidy-select}}> An unquoted column name(e.g., \code{cases}), multiple column names (e.g., \code{c(cases, deaths)}), \link[tidyselect:language]{other tidy-select expression}, or a vector of characters (e.g. \code{c("cases", "deaths")}). Variable names can be used as if @@ -33,90 +30,95 @@ The tidy-selection renaming interface is not supported, and cannot be used to provide output column names; if you want to customize the output column names, use \code{\link[dplyr:rename]{dplyr::rename}} after the slide.} -\item{...}{Additional arguments to pass to \code{data.table::frollmean}, for -example, \code{na.rm} and \code{algo}. \code{data.table::frollmean} is automatically -passed the data \code{x} to operate on, the window size \code{n}, and the alignment -\code{align}. Providing these args via \code{...} will cause an error.} +\item{...}{Additional arguments to pass to the slide computation \code{.f}, for +example, \code{algo} or \code{na.rm} in data.table functions. You don't need to +specify \code{.x}, \code{.window_size}, or \code{.align} (or \code{before}/\code{after} for slider +functions).} -\item{before, after}{How far \code{before} and \code{after} each \code{ref_time_value} should -the sliding window extend? At least one of these two arguments must be -provided; the other's default will be 0. The accepted values for these -depend on the type of the \code{time_value} column: +\item{.window_size}{The size of the sliding window. By default, this is 1, +meaning that only the current ref_time_value is included. The accepted values +here depend on the \code{time_value} column: \itemize{ -\item if it is a Date and the cadence is daily, then they can be integers -(which will be interpreted in units of days) or difftimes with units -"days" -\item if it is a Date and the cadence is weekly, then they must be difftimes -with units "weeks" -\item if it is an integer, then they must be integers -} - -Endpoints of the window are inclusive. Common settings: -\itemize{ -\item For trailing/right-aligned windows from \code{ref_time_value - k} to -\code{ref_time_value}: either pass \code{before=k} by itself, or pass \verb{before=k, after=0}. -\item For center-aligned windows from \code{ref_time_value - k} to -\code{ref_time_value + k}: pass \verb{before=k, after=k}. -\item For leading/left-aligned windows from \code{ref_time_value} to -\code{ref_time_value + k}: either pass pass \code{after=k} by itself, -or pass \verb{before=0, after=k}. -} - -See "Details:" on how missing rows are handled within the window.} - -\item{ref_time_values}{Time values for sliding computations, meaning, each +\item if time_type is Date and the cadence is daily, then \code{.window_size} can be +an integer (which will be interpreted in units of days) or a difftime +with units "days" +\item if time_type is Date and the cadence is weekly, then \code{.window_size} must +be a difftime with units "weeks" +\item if time_type is an integer, then \code{.window_size} must be an integer +}} + +\item{.align}{The alignment of the sliding window. If \code{right} (default), then +the window has its end at the reference time; if \code{center}, then the window is +centered at the reference time; if \code{left}, then the window has its start at +the reference time. If the alignment is \code{center} and the window size is odd, +then the window will have floor(window_size/2) points before and after the +reference time. If the window size is even, then the window will be +asymmetric and have one less value on the right side of the reference time +(assuming time increases from left to right).} + +\item{.ref_time_values}{Time values for sliding computations, meaning, each element of this vector serves as the reference time point for one sliding window. If missing, then this will be set to all unique time values in the underlying data table, by default.} -\item{new_col_name}{Not supported. Included to match \code{epi_slide} interface.} - -\item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in -the output even with \code{ref_time_values} provided, with some type of missing +\item{.all_rows}{If \code{.all_rows = TRUE}, then all rows of \code{.x} will be kept in +the output even with \code{.ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s -outside \code{ref_time_values}; otherwise, there will be one row for each row in -\code{x} that had a \code{time_value} in \code{ref_time_values}. Default is \code{FALSE}. The +outside \code{.ref_time_values}; otherwise, there will be one row for each row in +\code{.x} that had a \code{time_value} in \code{.ref_time_values}. Default is \code{FALSE}. The missing value marker is the result of \code{vctrs::vec_cast}ing \code{NA} to the type -of the slide computation output. If using \code{as_list_col = TRUE}, note that -the missing marker is a \code{NULL} entry in the list column; for certain -operations, you might want to replace these \code{NULL} entries with a different -\code{NA} marker.} - -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} +of the slide computation output.} } \value{ -An \code{epi_df} object given by appending one or more new columns to \code{x}, -named according to the \code{new_col_name} argument. +An \code{epi_df} object given by appending one or more new columns to \code{.x}, +named according to the \code{.new_col_name} argument. } \description{ Slides an n-timestep mean over variables in an \code{epi_df} object. See the \href{https://cmu-delphi.github.io/epiprocess/articles/slide.html}{slide vignette} for examples. } \details{ -Wrapper around \code{epi_slide_opt} with \code{f = datatable::frollmean}. - -To "slide" means to apply a function over a rolling window of time -steps for each data group, where the window is centered at a reference time -and left and right endpoints are given by the \code{before} and \code{after} -arguments. -If there are not enough time steps available to complete the window at any -given reference time, then \verb{epi_slide_*()} will fail; it requires a -complete window to perform the computation. For a centrally-aligned slide -of \code{n} \code{time_value}s in a sliding window, set \code{before = (n-1)/2} and \code{after = (n-1)/2} when the number of \code{time_value}s in a sliding window is odd and -\code{before = n/2-1} and \code{after = n/2} when \code{n} is even. - -Sometimes, we want to experiment with various trailing or leading window -widths and compare the slide outputs. In the (uncommon) case where -zero-width windows are considered, manually pass both the \code{before} and -\code{after} arguments. +Wrapper around \code{epi_slide_opt} with \code{.f = datatable::frollmean}. + +To "slide" means to apply a function or formula over a rolling +window. The \code{.window_size} arg determines the width of the window +(including the reference time) and the \code{.align} arg governs how the window +is aligned (see below for examples). The \code{.ref_time_values} arg controls +which time values to consider for the slide and \code{.all_rows} allows you to +keep NAs around. + +\verb{epi_slide_*()} does not require a complete window (such as on the left +boundary of the dataset) and will attempt to perform the computation +anyway. The issue of what to do with partial computations (those run on +incomplete windows) is therefore left up to the user, either through the +specified function or formula \code{f}, or through post-processing. + +Let's look at some window examples, assuming that the reference time value +is \code{tv}. With .align = "right" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 2, tv - 1, tv} + +With .align = "center" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 1, tv, tv + 1} + +With .align = "center" and .window_size = 4, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 2, tv - 1, tv, tv + 1} + +With .align = "left" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv, tv + 1, tv + 2} } \examples{ # slide a 7-day trailing average formula on cases jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide_mean(cases, before = 6) \%>\% + epi_slide_mean(cases, .window_size = 7) \%>\% # Remove a nonessential var. to ensure new col is printed dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) \%>\% ungroup() @@ -127,7 +129,7 @@ jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% epi_slide_mean( cases, - before = 6, + .window_size = 7, # `frollmean` options na.rm = TRUE, algo = "exact", hasNA = TRUE ) \%>\% @@ -137,23 +139,23 @@ jhu_csse_daily_subset \%>\% # slide a 7-day leading average jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide_mean(cases, after = 6) \%>\% + epi_slide_mean(cases, .window_size = 7, .align = "right") \%>\% # Remove a nonessential var. to ensure new col is printed dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) \%>\% ungroup() -# slide a 7-day centre-aligned average +# slide a 7-day center-aligned average jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide_mean(cases, before = 3, after = 3) \%>\% + epi_slide_mean(cases, .window_size = 7, .align = "center") \%>\% # Remove a nonessential var. to ensure new col is printed dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) \%>\% ungroup() -# slide a 14-day centre-aligned average +# slide a 14-day center-aligned average jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide_mean(cases, before = 6, after = 7) \%>\% + epi_slide_mean(cases, .window_size = 14, .align = "center") \%>\% # Remove a nonessential var. to ensure new col is printed dplyr::select(geo_value, time_value, cases, cases_14dav = slide_value_cases) \%>\% ungroup() diff --git a/man/epi_slide_opt.Rd b/man/epi_slide_opt.Rd index f0442d1e..e9ea1a8c 100644 --- a/man/epi_slide_opt.Rd +++ b/man/epi_slide_opt.Rd @@ -2,28 +2,26 @@ % Please edit documentation in R/slide.R \name{epi_slide_opt} \alias{epi_slide_opt} -\title{Optimized slide function for performing common rolling computations on an \code{epi_df} object} +\title{Optimized slide function for performing common rolling computations on an +\code{epi_df} object} \usage{ epi_slide_opt( - x, - col_names, - f, + .x, + .col_names, + .f, ..., - before = NULL, - after = NULL, - ref_time_values = NULL, - new_col_name = NULL, - all_rows = FALSE, - as_list_col = deprecated(), - names_sep = NULL + .window_size = 0, + .align = c("right", "center", "left"), + .ref_time_values = NULL, + .all_rows = FALSE ) } \arguments{ -\item{x}{The \code{epi_df} object under consideration, \link[dplyr:group_by]{grouped} -or ungrouped. If ungrouped, all data in \code{x} will be treated as part of a +\item{.x}{The \code{epi_df} object under consideration, \link[dplyr:group_by]{grouped} +or ungrouped. If ungrouped, all data in \code{.x} will be treated as part of a single data group.} -\item{col_names}{<\code{\link[=dplyr_tidy_select]{tidy-select}}> An unquoted column +\item{.col_names}{<\code{\link[=dplyr_tidy_select]{tidy-select}}> An unquoted column name(e.g., \code{cases}), multiple column names (e.g., \code{c(cases, deaths)}), \link[tidyselect:language]{other tidy-select expression}, or a vector of characters (e.g. \code{c("cases", "deaths")}). Variable names can be used as if @@ -34,82 +32,61 @@ The tidy-selection renaming interface is not supported, and cannot be used to provide output column names; if you want to customize the output column names, use \code{\link[dplyr:rename]{dplyr::rename}} after the slide.} -\item{f}{Function; together with \code{...} specifies the computation to slide. -\code{f} must be one of \code{data.table}'s rolling functions +\item{.f}{Function; together with \code{...} specifies the computation to slide. +\code{.f} must be one of \code{data.table}'s rolling functions (\code{frollmean}, \code{frollsum}, \code{frollapply}. See \link[data.table:froll]{data.table::roll}) or one of \code{slider}'s specialized sliding functions (\code{slide_mean}, \code{slide_sum}, -etc. See \link[slider:summary-slide]{slider::summary-slide}). To "slide" means to apply a -computation within a sliding (a.k.a. "rolling") time window for each data -group. The window is determined by the \code{before} and \code{after} parameters -described below. One time step is typically one day or one week; see -details for more explanation. +etc. See \link[slider:summary-slide]{slider::summary-slide}). The optimized \code{data.table} and \code{slider} functions can't be directly passed -as the computation function in \code{epi_slide} without careful handling to -make sure each computation group is made up of the \code{n} dates rather than -\code{n} points. \code{epi_slide_opt} (and wrapper functions \code{epi_slide_mean} and -\code{epi_slide_sum}) take care of window completion automatically to prevent -associated errors.} - -\item{...}{Additional arguments to pass to the slide computation \code{f}, for -example, \code{na.rm} and \code{algo} if \code{f} is a \code{data.table} function. If \code{f} is -a \code{data.table} function, it is automatically passed the data \code{x} to -operate on, the window size \code{n}, and the alignment \code{align}. Providing -these args via \code{...} will cause an error. If \code{f} is a \code{slider} function, -it is automatically passed the data \code{x} to operate on, and number of -points \code{before} and \code{after} to use in the computation.} - -\item{before, after}{How far \code{before} and \code{after} each \code{ref_time_value} should -the sliding window extend? At least one of these two arguments must be -provided; the other's default will be 0. The accepted values for these -depend on the type of the \code{time_value} column: +as the computation function in \code{epi_slide} without careful handling to make +sure each computation group is made up of the \code{.window_size} dates rather +than \code{.window_size} points. \code{epi_slide_opt} (and wrapper functions +\code{epi_slide_mean} and \code{epi_slide_sum}) take care of window completion +automatically to prevent associated errors.} + +\item{...}{Additional arguments to pass to the slide computation \code{.f}, for +example, \code{algo} or \code{na.rm} in data.table functions. You don't need to +specify \code{.x}, \code{.window_size}, or \code{.align} (or \code{before}/\code{after} for slider +functions).} + +\item{.window_size}{The size of the sliding window. By default, this is 1, +meaning that only the current ref_time_value is included. The accepted values +here depend on the \code{time_value} column: \itemize{ -\item if it is a Date and the cadence is daily, then they can be integers -(which will be interpreted in units of days) or difftimes with units -"days" -\item if it is a Date and the cadence is weekly, then they must be difftimes -with units "weeks" -\item if it is an integer, then they must be integers -} - -Endpoints of the window are inclusive. Common settings: -\itemize{ -\item For trailing/right-aligned windows from \code{ref_time_value - k} to -\code{ref_time_value}: either pass \code{before=k} by itself, or pass \verb{before=k, after=0}. -\item For center-aligned windows from \code{ref_time_value - k} to -\code{ref_time_value + k}: pass \verb{before=k, after=k}. -\item For leading/left-aligned windows from \code{ref_time_value} to -\code{ref_time_value + k}: either pass pass \code{after=k} by itself, -or pass \verb{before=0, after=k}. -} - -See "Details:" on how missing rows are handled within the window.} - -\item{ref_time_values}{Time values for sliding computations, meaning, each +\item if time_type is Date and the cadence is daily, then \code{.window_size} can be +an integer (which will be interpreted in units of days) or a difftime +with units "days" +\item if time_type is Date and the cadence is weekly, then \code{.window_size} must +be a difftime with units "weeks" +\item if time_type is an integer, then \code{.window_size} must be an integer +}} + +\item{.align}{The alignment of the sliding window. If \code{right} (default), then +the window has its end at the reference time; if \code{center}, then the window is +centered at the reference time; if \code{left}, then the window has its start at +the reference time. If the alignment is \code{center} and the window size is odd, +then the window will have floor(window_size/2) points before and after the +reference time. If the window size is even, then the window will be +asymmetric and have one less value on the right side of the reference time +(assuming time increases from left to right).} + +\item{.ref_time_values}{Time values for sliding computations, meaning, each element of this vector serves as the reference time point for one sliding window. If missing, then this will be set to all unique time values in the underlying data table, by default.} -\item{new_col_name}{Not supported. Included to match \code{epi_slide} interface.} - -\item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in -the output even with \code{ref_time_values} provided, with some type of missing +\item{.all_rows}{If \code{.all_rows = TRUE}, then all rows of \code{.x} will be kept in +the output even with \code{.ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s -outside \code{ref_time_values}; otherwise, there will be one row for each row in -\code{x} that had a \code{time_value} in \code{ref_time_values}. Default is \code{FALSE}. The +outside \code{.ref_time_values}; otherwise, there will be one row for each row in +\code{.x} that had a \code{time_value} in \code{.ref_time_values}. Default is \code{FALSE}. The missing value marker is the result of \code{vctrs::vec_cast}ing \code{NA} to the type -of the slide computation output. If using \code{as_list_col = TRUE}, note that -the missing marker is a \code{NULL} entry in the list column; for certain -operations, you might want to replace these \code{NULL} entries with a different -\code{NA} marker.} - -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} +of the slide computation output.} } \value{ -An \code{epi_df} object given by appending one or more new columns to \code{x}, -named according to the \code{new_col_name} argument. +An \code{epi_df} object given by appending one or more new columns to \code{.x}, +named according to the \code{.new_col_name} argument. } \description{ Slides an n-timestep \link[data.table:froll]{data.table::froll} or \link[slider:summary-slide]{slider::summary-slide} function @@ -118,20 +95,39 @@ over variables in an \code{epi_df} object. See the for examples. } \details{ -To "slide" means to apply a function over a rolling window of time -steps for each data group, where the window is centered at a reference time -and left and right endpoints are given by the \code{before} and \code{after} -arguments. -If there are not enough time steps available to complete the window at any -given reference time, then \verb{epi_slide_*()} will fail; it requires a -complete window to perform the computation. For a centrally-aligned slide -of \code{n} \code{time_value}s in a sliding window, set \code{before = (n-1)/2} and \code{after = (n-1)/2} when the number of \code{time_value}s in a sliding window is odd and -\code{before = n/2-1} and \code{after = n/2} when \code{n} is even. - -Sometimes, we want to experiment with various trailing or leading window -widths and compare the slide outputs. In the (uncommon) case where -zero-width windows are considered, manually pass both the \code{before} and -\code{after} arguments. +To "slide" means to apply a function or formula over a rolling +window. The \code{.window_size} arg determines the width of the window +(including the reference time) and the \code{.align} arg governs how the window +is aligned (see below for examples). The \code{.ref_time_values} arg controls +which time values to consider for the slide and \code{.all_rows} allows you to +keep NAs around. + +\verb{epi_slide_*()} does not require a complete window (such as on the left +boundary of the dataset) and will attempt to perform the computation +anyway. The issue of what to do with partial computations (those run on +incomplete windows) is therefore left up to the user, either through the +specified function or formula \code{f}, or through post-processing. + +Let's look at some window examples, assuming that the reference time value +is \code{tv}. With .align = "right" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 2, tv - 1, tv} + +With .align = "center" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 1, tv, tv + 1} + +With .align = "center" and .window_size = 4, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 2, tv - 1, tv, tv + 1} + +With .align = "left" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv, tv + 1, tv + 2} } \examples{ # slide a 7-day trailing average formula on cases. This can also be done with `epi_slide_mean` @@ -139,7 +135,7 @@ jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% epi_slide_opt( cases, - f = data.table::frollmean, before = 6 + .f = data.table::frollmean, .window_size = 7 ) \%>\% # Remove a nonessential var. to ensure new col is printed, and rename new col dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) \%>\% @@ -151,9 +147,9 @@ jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% epi_slide_opt( cases, - f = data.table::frollmean, before = 6, + .f = data.table::frollmean, .window_size = 7, # `frollmean` options - na.rm = TRUE, algo = "exact", hasNA = TRUE + algo = "exact", hasNA = TRUE, na.rm = TRUE ) \%>\% dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) \%>\% ungroup() @@ -163,18 +159,18 @@ jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% epi_slide_opt( cases, - f = slider::slide_mean, after = 6 + .f = slider::slide_mean, .window_size = 7, .align = "left" ) \%>\% # Remove a nonessential var. to ensure new col is printed dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) \%>\% ungroup() -# slide a 7-day centre-aligned sum. This can also be done with `epi_slide_sum` +# slide a 7-day center-aligned sum. This can also be done with `epi_slide_sum` jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% epi_slide_opt( cases, - f = data.table::frollsum, before = 3, after = 3 + .f = data.table::frollsum, .window_size = 6, .align = "center" ) \%>\% # Remove a nonessential var. to ensure new col is printed dplyr::select(geo_value, time_value, cases, cases_7dav = slide_value_cases) \%>\% diff --git a/man/epi_slide_sum.Rd b/man/epi_slide_sum.Rd index 8e79474a..20b6abc2 100644 --- a/man/epi_slide_sum.Rd +++ b/man/epi_slide_sum.Rd @@ -5,24 +5,21 @@ \title{Optimized slide function for performing rolling sums on an \code{epi_df} object} \usage{ epi_slide_sum( - x, - col_names, + .x, + .col_names, ..., - before = NULL, - after = NULL, - ref_time_values = NULL, - new_col_name = NULL, - all_rows = FALSE, - as_list_col = deprecated(), - names_sep = NULL + .window_size = 0, + .align = c("right", "center", "left"), + .ref_time_values = NULL, + .all_rows = FALSE ) } \arguments{ -\item{x}{The \code{epi_df} object under consideration, \link[dplyr:group_by]{grouped} -or ungrouped. If ungrouped, all data in \code{x} will be treated as part of a +\item{.x}{The \code{epi_df} object under consideration, \link[dplyr:group_by]{grouped} +or ungrouped. If ungrouped, all data in \code{.x} will be treated as part of a single data group.} -\item{col_names}{<\code{\link[=dplyr_tidy_select]{tidy-select}}> An unquoted column +\item{.col_names}{<\code{\link[=dplyr_tidy_select]{tidy-select}}> An unquoted column name(e.g., \code{cases}), multiple column names (e.g., \code{c(cases, deaths)}), \link[tidyselect:language]{other tidy-select expression}, or a vector of characters (e.g. \code{c("cases", "deaths")}). Variable names can be used as if @@ -33,90 +30,95 @@ The tidy-selection renaming interface is not supported, and cannot be used to provide output column names; if you want to customize the output column names, use \code{\link[dplyr:rename]{dplyr::rename}} after the slide.} -\item{...}{Additional arguments to pass to \code{data.table::frollsum}, for -example, \code{na.rm} and \code{algo}. \code{data.table::frollsum} is automatically -passed the data \code{x} to operate on, the window size \code{n}, and the alignment -\code{align}. Providing these args via \code{...} will cause an error.} +\item{...}{Additional arguments to pass to the slide computation \code{.f}, for +example, \code{algo} or \code{na.rm} in data.table functions. You don't need to +specify \code{.x}, \code{.window_size}, or \code{.align} (or \code{before}/\code{after} for slider +functions).} -\item{before, after}{How far \code{before} and \code{after} each \code{ref_time_value} should -the sliding window extend? At least one of these two arguments must be -provided; the other's default will be 0. The accepted values for these -depend on the type of the \code{time_value} column: +\item{.window_size}{The size of the sliding window. By default, this is 1, +meaning that only the current ref_time_value is included. The accepted values +here depend on the \code{time_value} column: \itemize{ -\item if it is a Date and the cadence is daily, then they can be integers -(which will be interpreted in units of days) or difftimes with units -"days" -\item if it is a Date and the cadence is weekly, then they must be difftimes -with units "weeks" -\item if it is an integer, then they must be integers -} +\item if time_type is Date and the cadence is daily, then \code{.window_size} can be +an integer (which will be interpreted in units of days) or a difftime +with units "days" +\item if time_type is Date and the cadence is weekly, then \code{.window_size} must +be a difftime with units "weeks" +\item if time_type is an integer, then \code{.window_size} must be an integer +}} -Endpoints of the window are inclusive. Common settings: -\itemize{ -\item For trailing/right-aligned windows from \code{ref_time_value - k} to -\code{ref_time_value}: either pass \code{before=k} by itself, or pass \verb{before=k, after=0}. -\item For center-aligned windows from \code{ref_time_value - k} to -\code{ref_time_value + k}: pass \verb{before=k, after=k}. -\item For leading/left-aligned windows from \code{ref_time_value} to -\code{ref_time_value + k}: either pass pass \code{after=k} by itself, -or pass \verb{before=0, after=k}. -} +\item{.align}{The alignment of the sliding window. If \code{right} (default), then +the window has its end at the reference time; if \code{center}, then the window is +centered at the reference time; if \code{left}, then the window has its start at +the reference time. If the alignment is \code{center} and the window size is odd, +then the window will have floor(window_size/2) points before and after the +reference time. If the window size is even, then the window will be +asymmetric and have one less value on the right side of the reference time +(assuming time increases from left to right).} -See "Details:" on how missing rows are handled within the window.} - -\item{ref_time_values}{Time values for sliding computations, meaning, each +\item{.ref_time_values}{Time values for sliding computations, meaning, each element of this vector serves as the reference time point for one sliding window. If missing, then this will be set to all unique time values in the underlying data table, by default.} -\item{new_col_name}{Not supported. Included to match \code{epi_slide} interface.} - -\item{all_rows}{If \code{all_rows = TRUE}, then all rows of \code{x} will be kept in -the output even with \code{ref_time_values} provided, with some type of missing +\item{.all_rows}{If \code{.all_rows = TRUE}, then all rows of \code{.x} will be kept in +the output even with \code{.ref_time_values} provided, with some type of missing value marker for the slide computation output column(s) for \code{time_value}s -outside \code{ref_time_values}; otherwise, there will be one row for each row in -\code{x} that had a \code{time_value} in \code{ref_time_values}. Default is \code{FALSE}. The +outside \code{.ref_time_values}; otherwise, there will be one row for each row in +\code{.x} that had a \code{time_value} in \code{.ref_time_values}. Default is \code{FALSE}. The missing value marker is the result of \code{vctrs::vec_cast}ing \code{NA} to the type -of the slide computation output. If using \code{as_list_col = TRUE}, note that -the missing marker is a \code{NULL} entry in the list column; for certain -operations, you might want to replace these \code{NULL} entries with a different -\code{NA} marker.} - -\item{as_list_col}{Not supported. Included to match \code{epi_slide} interface.} - -\item{names_sep}{Not supported. Included to match \code{epi_slide} interface.} +of the slide computation output.} } \value{ -An \code{epi_df} object given by appending one or more new columns to \code{x}, -named according to the \code{new_col_name} argument. +An \code{epi_df} object given by appending one or more new columns to \code{.x}, +named according to the \code{.new_col_name} argument. } \description{ Slides an n-timestep sum over variables in an \code{epi_df} object. See the \href{https://cmu-delphi.github.io/epiprocess/articles/slide.html}{slide vignette} for examples. } \details{ -Wrapper around \code{epi_slide_opt} with \code{f = datatable::frollsum}. - -To "slide" means to apply a function over a rolling window of time -steps for each data group, where the window is centered at a reference time -and left and right endpoints are given by the \code{before} and \code{after} -arguments. -If there are not enough time steps available to complete the window at any -given reference time, then \verb{epi_slide_*()} will fail; it requires a -complete window to perform the computation. For a centrally-aligned slide -of \code{n} \code{time_value}s in a sliding window, set \code{before = (n-1)/2} and \code{after = (n-1)/2} when the number of \code{time_value}s in a sliding window is odd and -\code{before = n/2-1} and \code{after = n/2} when \code{n} is even. - -Sometimes, we want to experiment with various trailing or leading window -widths and compare the slide outputs. In the (uncommon) case where -zero-width windows are considered, manually pass both the \code{before} and -\code{after} arguments. +Wrapper around \code{epi_slide_opt} with \code{.f = datatable::frollsum}. + +To "slide" means to apply a function or formula over a rolling +window. The \code{.window_size} arg determines the width of the window +(including the reference time) and the \code{.align} arg governs how the window +is aligned (see below for examples). The \code{.ref_time_values} arg controls +which time values to consider for the slide and \code{.all_rows} allows you to +keep NAs around. + +\verb{epi_slide_*()} does not require a complete window (such as on the left +boundary of the dataset) and will attempt to perform the computation +anyway. The issue of what to do with partial computations (those run on +incomplete windows) is therefore left up to the user, either through the +specified function or formula \code{f}, or through post-processing. + +Let's look at some window examples, assuming that the reference time value +is \code{tv}. With .align = "right" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 2, tv - 1, tv} + +With .align = "center" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 1, tv, tv + 1} + +With .align = "center" and .window_size = 4, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv - 2, tv - 1, tv, tv + 1} + +With .align = "left" and .window_size = 3, the window will be: + +time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: \link{tv, tv + 1, tv + 2} } \examples{ # slide a 7-day trailing sum formula on cases jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% - epi_slide_sum(cases, before = 6) \%>\% + epi_slide_sum(cases, .window_size = 7) \%>\% # Remove a nonessential var. to ensure new col is printed dplyr::select(geo_value, time_value, cases, cases_7dsum = slide_value_cases) \%>\% ungroup() diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index dcf121f6..08738252 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -1,4 +1,5 @@ library(cli) +library(dplyr) test_date <- as.Date("2020-01-01") days_dt <- as.difftime(1, units = "days") @@ -24,7 +25,7 @@ overlap_index <- toy_edf %>% as.Date() # Utility functions for computing expected slide_sum output -compute_slide_external <- function(before, overlap = FALSE) { +compute_slide_external <- function(.window_size, overlap = FALSE) { if (overlap) { toy_edf <- toy_edf %>% filter(time_value %in% overlap_index) @@ -33,16 +34,16 @@ compute_slide_external <- function(before, overlap = FALSE) { } slide_value <- toy_edf %>% group_by(time_value) %>% - summarize(value = sum(value)) %>% - pull(value) %>% - slider::slide_sum(before = before) + summarize(value = sum(.data$value)) %>% + pull(.data$value) %>% + slider::slide_sum(before = .window_size - 1) toy_edf_g %>% mutate(slide_value = slide_value) %>% ungroup() } -compute_slide_external_g <- function(before) { +compute_slide_external_g <- function(.window_size) { toy_edf_g %>% - mutate(slide_value = slider::slide_sum(value, before = before)) %>% + mutate(slide_value = slider::slide_sum(.data$value, before = .window_size - 1)) %>% dplyr::arrange(geo_value, time_value) %>% as_epi_df(as_of = test_date + 100) } @@ -56,27 +57,19 @@ bad_values <- list( ) purrr::walk(bad_values, function(bad_value) { test_that( - format_inline("`before` and `after` in epi_slide fail on {bad_value}"), + format_inline("`.window_size` fails on {bad_value}"), { expect_error( - epi_slide(toy_edf_g, before = bad_value, ref_time_values = test_date + 2), - class = "epiprocess__validate_slide_window_arg" - ) - expect_error( - epi_slide(toy_edf_g, after = bad_value, ref_time_values = test_date + 2), + epi_slide(toy_edf_g, .window_size = bad_value, .ref_time_values = test_date + 2), class = "epiprocess__validate_slide_window_arg" ) } ) }) purrr::walk(bad_values, function(bad_value) { - test_that(format_inline("`before` and `after` in epi_slide_mean fail on {bad_value}"), { + test_that(format_inline("`.window_size` in epi_slide_mean fails on {bad_value}"), { expect_error( - epi_slide_mean(toy_edf_g, col_names = value, before = bad_value, ref_time_values = test_date + 2), - class = "epiprocess__validate_slide_window_arg" - ) - expect_error( - epi_slide_mean(toy_edf_g, col_names = value, after = bad_value, ref_time_values = test_date + 2), + epi_slide_mean(toy_edf_g, .col_names = value, .window_size = bad_value, .ref_time_values = test_date + 2), class = "epiprocess__validate_slide_window_arg" ) }) @@ -84,58 +77,44 @@ purrr::walk(bad_values, function(bad_value) { bad_values <- c(min(toy_edf_g$time_value) - 1, max(toy_edf_g$time_value) + 1) purrr::walk(bad_values, function(bad_value) { - test_that(format_inline("epi_slide[_mean]: `ref_time_values` out of range for all groups {bad_value}"), { + test_that(format_inline("epi_slide[_mean]: `.ref_time_values` out of range for all groups {bad_value}"), { expect_error( - epi_slide(toy_edf_g, f_tib_avg_count, before = 2 * days_dt, ref_time_values = bad_value), + epi_slide(toy_edf_g, f_tib_avg_count, .window_size = 2 * days_dt, .ref_time_values = bad_value), class = "epi_slide__invalid_ref_time_values" ) expect_error( - epi_slide_mean(toy_edf_g, col_names = value, before = 2 * days_dt, ref_time_values = bad_value), + epi_slide_mean(toy_edf_g, .col_names = value, .window_size = 2 * days_dt, .ref_time_values = bad_value), class = "epi_slide_opt__invalid_ref_time_values" ) }) }) test_that( - "epi_slide or epi_slide_mean: `ref_time_values` in range for at least one group generate no error", + "epi_slide or epi_slide_mean: `.ref_time_values` in range for at least one group generate no error", { expect_equal( - epi_slide(toy_edf_g, ~ sum(.x$value), before = 2 * days_dt, ref_time_values = test_date + 5) %>% ungroup(), - compute_slide_external_g(before = 2) %>% ungroup() %>% filter(time_value == test_date + 5) + epi_slide(toy_edf_g, ~ sum(.x$value), .window_size = 2 * days_dt, .ref_time_values = test_date + 5) %>% ungroup(), + compute_slide_external_g(.window_size = 2) %>% ungroup() %>% filter(time_value == test_date + 5) ) expect_equal( - epi_slide_sum(toy_edf_g, value, before = 2 * days_dt, ref_time_values = test_date + 5, na.rm = TRUE) %>% + epi_slide_sum(toy_edf_g, value, .window_size = 2 * days_dt, .ref_time_values = test_date + 5, na.rm = TRUE) %>% ungroup() %>% rename(slide_value = slide_value_value), - compute_slide_external_g(before = 2) %>% ungroup() %>% filter(time_value == test_date + 5) + compute_slide_external_g(.window_size = 2) %>% ungroup() %>% filter(time_value == test_date + 5) ) } ) -test_that("epi_slide_mean errors when `as_list_col` non-NULL", { - expect_error( - toy_edf %>% - filter( - geo_value == "a" - ) %>% - epi_slide_mean( - value, - before = 6 * days_dt, as_list_col = TRUE, na.rm = TRUE - ), - class = "lifecycle_error_deprecated" - ) -}) - test_that("epi_slide alerts if the provided f doesn't take enough args", { expect_no_error( - epi_slide(toy_edf_g, f_tib_avg_count, before = days_dt, ref_time_values = test_date + 1), + epi_slide(toy_edf_g, f_tib_avg_count, .window_size = days_dt, .ref_time_values = test_date + 1), ) expect_no_warning( - epi_slide(toy_edf_g, f_tib_avg_count, before = days_dt, ref_time_values = test_date + 1), + epi_slide(toy_edf_g, f_tib_avg_count, .window_size = days_dt, .ref_time_values = test_date + 1), ) f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$value), count = length(x$value)) - expect_warning(epi_slide(toy_edf_g, f_x_dots, before = days_dt, ref_time_values = test_date + 1), + expect_warning(epi_slide(toy_edf_g, f_x_dots, .window_size = days_dt, .ref_time_values = test_date + 1), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) }) @@ -153,10 +132,7 @@ for (all_rows in list(FALSE, TRUE)) { { simpler_slide_call <- function(f) { toy_edf_g %>% - epi_slide( - before = 6 * days_dt, f, - ref_time_values = rtv, all_rows = all_rows - ) + epi_slide(f, .window_size = 6 * days_dt, .ref_time_values = rtv, .all_rows = all_rows) } filter_expected <- function(x) { if (all_rows && !is.null(rtv)) { @@ -170,43 +146,45 @@ for (all_rows in list(FALSE, TRUE)) { expect_equal( simpler_slide_call(~ sum(.x$value)), - compute_slide_external_g(before = 6) %>% filter_expected() + compute_slide_external_g(.window_size = 6) %>% filter_expected() ) expect_equal( simpler_slide_call(~ list(rep(sum(.x$value), 2L))), - compute_slide_external_g(before = 6) %>% + compute_slide_external_g(.window_size = 6) %>% mutate(slide_value = lapply(slide_value, rep, 2L)) %>% filter_expected() ) expect_equal( simpler_slide_call(~ data.frame(slide_value = sum(.x$value))), - compute_slide_external_g(before = 6) %>% filter_expected() + compute_slide_external_g(.window_size = 6) %>% filter_expected() ) expect_equal( simpler_slide_call(~ list(data.frame(slide_value = sum(.x$value)))), - compute_slide_external_g(before = 6) %>% + compute_slide_external_g(.window_size = 6) %>% mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% filter_expected() ) expect_identical( simpler_slide_call(~ tibble(slide_value = list(sum(.x$value)))), - compute_slide_external_g(before = 6) %>% mutate(slide_value = as.list(slide_value)) %>% filter_expected() + compute_slide_external_g(.window_size = 6) %>% + mutate(slide_value = as.list(slide_value)) %>% + filter_expected() ) # unnamed data-masking expression producing data frame: # unfortunately, we can't pass this directly as `f` and need an extra comma slide_unnamed_df <- toy_edf_g %>% epi_slide( - before = 6L, , data.frame(slide_value = sum(.x$value)), - ref_time_values = rtv, all_rows = all_rows + .window_size = 6L, , data.frame(slide_value = sum(.x$value)), + .ref_time_values = rtv, .all_rows = all_rows ) expect_identical( slide_unnamed_df, - compute_slide_external_g(before = 6) %>% filter_expected() + compute_slide_external_g(.window_size = 6) %>% filter_expected() ) } ) @@ -219,8 +197,8 @@ for (all_rows in list(FALSE, TRUE)) { for (rtv in list(NULL, overlap_index)) { test_that( format_inline( - "epi_slide_sum works with formulas, lists, and data.frame outputs with ref_time_value={rtv} - and all_rows={all_rows}" + "epi_slide_sum works with formulas, lists, and data.frame outputs with .ref_time_value={rtv} + and .all_rows={all_rows}" ), { filter_expected <- function(x) { @@ -237,11 +215,10 @@ for (all_rows in list(FALSE, TRUE)) { toy_edf_g %>% epi_slide_sum( value, - before = 6 * days_dt, - ref_time_values = rtv, all_rows = all_rows, na.rm = TRUE + .window_size = 6 * days_dt, .ref_time_values = rtv, .all_rows = all_rows, na.rm = TRUE ) %>% rename(slide_value = slide_value_value), - compute_slide_external_g(before = 6) %>% filter_expected() + compute_slide_external_g(.window_size = 6) %>% filter_expected() ) } ) @@ -253,13 +230,13 @@ purrr::walk(possible_f, function(f) { test_that("epi_slide computation can use ref_time_value", { # Grouped with multiple geos expect_equal( - toy_edf_g %>% epi_slide(f = f, before = 50 * days_dt), + toy_edf_g %>% epi_slide(f, .window_size = 50 * days_dt), toy_edf_g %>% mutate(slide_value = time_value) ) # Ungrouped with multiple geos expect_equal( - toy_edf %>% epi_slide(f = f, before = 50 * days_dt), + toy_edf %>% epi_slide(f, .window_size = 50 * days_dt), toy_edf %>% mutate(slide_value = time_value) %>% arrange(time_value) ) }) @@ -268,7 +245,7 @@ purrr::walk(possible_f, function(f) { test_that("epi_slide computation via dots can use ref_time_value and group", { # Use ref_time_value expect_equal( - toy_edf_g %>% epi_slide(before = 50 * days_dt, slide_value = .ref_time_value), + toy_edf_g %>% epi_slide(slide_value = .ref_time_value, .window_size = 50 * days_dt), toy_edf_g %>% mutate(slide_value = time_value) ) @@ -276,25 +253,25 @@ test_that("epi_slide computation via dots can use ref_time_value and group", { # `.env`. expect_error(toy_edf_g %>% epi_slide( - before = 50 * days_dt, - slide_value = .env$.ref_time_value + slide_value = .env$.ref_time_value, + .window_size = 50 * days_dt )) # Grouped and use group key as value expect_equal( - toy_edf_g %>% epi_slide(before = 2 * days_dt, slide_value = .group_key$geo_value), + toy_edf_g %>% epi_slide(slide_value = .group_key$geo_value, .window_size = 2 * days_dt), toy_edf_g %>% mutate(slide_value = geo_value) ) # Use entire group_key object expect_equal( - toy_edf_g %>% epi_slide(before = 2 * days_dt, slide_value = nrow(.group_key)), + toy_edf_g %>% epi_slide(.window_size = 2 * days_dt, slide_value = nrow(.group_key)), toy_edf_g %>% mutate(slide_value = 1L) ) # Ungrouped with multiple geos expect_equal( - toy_edf %>% epi_slide(before = 50 * days_dt, slide_value = .ref_time_value), + toy_edf %>% epi_slide(.window_size = 50 * days_dt, slide_value = .ref_time_value), toy_edf %>% mutate(slide_value = time_value) %>% arrange(time_value) ) }) @@ -302,14 +279,14 @@ test_that("epi_slide computation via dots can use ref_time_value and group", { test_that("epi_slide computation via dots outputs the same result using col names and the data var", { expected_output <- toy_edf %>% epi_slide( - before = 2 * days_dt, + .window_size = 2 * days_dt, slide_value = max(time_value) ) %>% as_epi_df(as_of = test_date + 6) result1 <- toy_edf %>% epi_slide( - before = 2 * days_dt, + .window_size = 2 * days_dt, slide_value = max(.x$time_value) ) @@ -317,7 +294,7 @@ test_that("epi_slide computation via dots outputs the same result using col name result2 <- toy_edf %>% epi_slide( - before = 2 * days_dt, + .window_size = 2 * days_dt, slide_value = max(.data$time_value) ) @@ -327,7 +304,7 @@ test_that("epi_slide computation via dots outputs the same result using col name test_that("`epi_slide` can access objects inside of helper functions", { helper <- function(archive_haystack, time_value_needle) { archive_haystack %>% epi_slide( - has_needle = time_value_needle %in% time_value, before = 365000L * days_dt + has_needle = time_value_needle %in% time_value, .window_size = 365000L * days_dt ) } expect_error( @@ -340,13 +317,17 @@ test_that("`epi_slide` can access objects inside of helper functions", { test_that("basic ungrouped epi_slide computation produces expected output", { # Single geo expect_equal( - toy_edf %>% filter(geo_value == "a") %>% epi_slide(before = 50 * days_dt, slide_value = sum(.x$value)), - compute_slide_external_g(before = 50) %>% ungroup() %>% filter(geo_value == "a") %>% arrange(time_value) + toy_edf %>% + filter(geo_value == "a") %>% + epi_slide(.window_size = 50 * days_dt, slide_value = sum(.x$value)), + compute_slide_external_g(.window_size = 50) %>% ungroup() %>% filter(geo_value == "a") %>% arrange(time_value) ) # Multiple geos expect_equal( - toy_edf %>% filter(time_value %in% overlap_index) %>% epi_slide(before = 50 * days_dt, slide_value = sum(.x$value)), - compute_slide_external(before = 50, overlap = TRUE) %>% arrange(time_value) + toy_edf %>% + filter(time_value %in% overlap_index) %>% + epi_slide(.window_size = 50 * days_dt, slide_value = sum(.x$value)), + compute_slide_external(.window_size = 50, overlap = TRUE) %>% arrange(time_value) ) }) @@ -355,16 +336,16 @@ test_that("basic ungrouped epi_slide_mean computation produces expected output", expect_equal( toy_edf %>% filter(geo_value == "a") %>% - epi_slide_sum(value, before = 50 * days_dt, na.rm = TRUE) %>% + epi_slide_sum(value, .window_size = 50 * days_dt, na.rm = TRUE) %>% rename(slide_value = slide_value_value), - compute_slide_external_g(before = 50) %>% ungroup() %>% filter(geo_value == "a") %>% arrange(time_value) + compute_slide_external_g(.window_size = 50) %>% ungroup() %>% filter(geo_value == "a") %>% arrange(time_value) ) # Multiple geos # epi_slide_sum fails when input data groups contain duplicate time_values, # e.g. aggregating across geos expect_error( - toy_edf %>% epi_slide_sum(value, before = 6 * days_dt), + toy_edf %>% epi_slide_sum(value, .window_size = 6 * days_dt), class = "epiprocess__epi_slide_opt__duplicate_time_values" ) }) @@ -375,17 +356,17 @@ test_that("epi_slide can use sequential data masking expressions including NULL" edf_a <- tibble::tibble( geo_value = 1, time_value = 1:10, - value = 1:10 + value = 1:10 * 1.0 ) %>% as_epi_df(as_of = 12L) noisiness_a1 <- edf_a %>% group_by(geo_value) %>% epi_slide( - before = 1L, after = 2L, - valid = nrow(.x) == 4L, # not the best approach... - m = mean(.x$value[1:2]), - noisiness = sqrt(mean((value[3:4] - m)^2)), + .window_size = 5L, .align = "center", + valid = nrow(.x) == 5L, + m = .x$value[1], + noisiness = m + .x$value[5], m = NULL ) %>% ungroup() %>% @@ -394,10 +375,10 @@ test_that("epi_slide can use sequential data masking expressions including NULL" noisiness_a0 <- edf_a %>% filter( - time_value >= min(time_value) + 1L, + time_value >= min(time_value) + 2L, time_value <= max(time_value) - 2L ) %>% - mutate(noisiness = sqrt((3 - 1.5)^2 + (4 - 1.5)^2) / sqrt(2)) + mutate(noisiness = 2 * 3:8) expect_identical(noisiness_a1, noisiness_a0) @@ -411,8 +392,8 @@ test_that("epi_slide can use sequential data masking expressions including NULL" noisiness_b1 <- edf_b %>% group_by(geo_value) %>% epi_slide( - before = 1L, after = 2L, - valid = nrow(.x) == 4L, # not the best approach... + .window_size = 5L, .align = "center", + valid = nrow(.x) == 5L, model = list(lm(value ~ time_value, .x[1:2, ])), pred = list(predict(model[[1L]], newdata = .x[3:4, "time_value"])), model = NULL, @@ -425,7 +406,7 @@ test_that("epi_slide can use sequential data masking expressions including NULL" noisiness_b0 <- edf_b %>% filter( - time_value >= min(time_value) + 1L, + time_value >= min(time_value) + 2L, time_value <= max(time_value) - 2L ) %>% mutate(noisiness = sqrt((1 - 3)^2 + (2 - 4)^2) / sqrt(2)) @@ -435,19 +416,19 @@ test_that("epi_slide can use sequential data masking expressions including NULL" test_that("epi_slide complains on invalid computation outputs", { expect_error( - toy_edf %>% epi_slide(before = 6L, ~ lm(value ~ time_value, .x)), + toy_edf %>% epi_slide(.window_size = 6L, ~ lm(value ~ time_value, .x)), class = "epiprocess__invalid_slide_comp_value" ) expect_no_error( - toy_edf %>% epi_slide(before = 6L, ~ list(lm(value ~ time_value, .x))), + toy_edf %>% epi_slide(.window_size = 6L, ~ list(lm(value ~ time_value, .x))), class = "epiprocess__invalid_slide_comp_value" ) expect_error( - toy_edf %>% epi_slide(before = 6L, model = lm(value ~ time_value, .x)), + toy_edf %>% epi_slide(.window_size = 6L, model = lm(value ~ time_value, .x)), class = "epiprocess__invalid_slide_comp_tidyeval_output" ) expect_no_error( - toy_edf %>% epi_slide(before = 6L, model = list(lm(value ~ time_value, .x))), + toy_edf %>% epi_slide(.window_size = 6L, model = list(lm(value ~ time_value, .x))), class = "epiprocess__invalid_slide_comp_tidyeval_output" ) }) @@ -456,66 +437,71 @@ test_that("epi_slide can use {nm} :=", { nm <- "slide_value" expect_identical( # unfortunately, we can't pass this directly as `f` and need an extra comma - toy_edf_g %>% epi_slide(before = 6L, , !!nm := sum(value)), - compute_slide_external_g(before = 6) + toy_edf_g %>% epi_slide(.window_size = 6L, , !!nm := sum(value)), + compute_slide_external_g(.window_size = 6) ) }) test_that("epi_slide can produce packed outputs", { - packed_basic_result <- compute_slide_external_g(before = 6) %>% + packed_basic_result <- compute_slide_external_g(.window_size = 6) %>% tidyr::pack(container = c(slide_value)) %>% - dplyr_reconstruct(compute_slide_external_g(before = 6)) + dplyr_reconstruct(compute_slide_external_g(.window_size = 6)) expect_identical( - toy_edf_g %>% epi_slide(before = 6L, ~ tibble::tibble(slide_value = sum(.x$value)), new_col_name = "container"), + toy_edf_g %>% + epi_slide(.window_size = 6L, ~ tibble::tibble(slide_value = sum(.x$value)), .new_col_name = "container"), packed_basic_result ) expect_identical( - toy_edf_g %>% epi_slide(before = 6L, container = tibble::tibble(slide_value = sum(.x$value))), + toy_edf_g %>% + epi_slide(.window_size = 6L, container = tibble::tibble(slide_value = sum(.x$value))), packed_basic_result ) expect_identical( - toy_edf_g %>% epi_slide(before = 6L, , tibble::tibble(slide_value = sum(.x$value)), new_col_name = "container"), + toy_edf_g %>% + epi_slide(.window_size = 6L, , tibble::tibble(slide_value = sum(.x$value)), .new_col_name = "container"), packed_basic_result ) }) test_that("nested dataframe output names are controllable", { expect_equal( - toy_edf_g %>% epi_slide(before = 6 * days_dt, ~ data.frame(result = sum(.x$value))), - compute_slide_external_g(before = 6) %>% rename(result = slide_value) + toy_edf_g %>% epi_slide(.window_size = 6 * days_dt, ~ data.frame(result = sum(.x$value))), + compute_slide_external_g(.window_size = 6) %>% rename(result = slide_value) ) expect_equal( - toy_edf_g %>% epi_slide(before = 6 * days_dt, ~ data.frame(value_sum = sum(.x$value))), - compute_slide_external_g(before = 6) %>% rename(value_sum = slide_value) + toy_edf_g %>% epi_slide(.window_size = 6 * days_dt, ~ data.frame(value_sum = sum(.x$value))), + compute_slide_external_g(.window_size = 6) %>% rename(value_sum = slide_value) ) }) # TODO: This seems really strange and counter-intuitive. Deprecate?4 test_that("non-size-1 f outputs are no-op recycled", { expect_equal( - toy_edf %>% filter(time_value %in% overlap_index) %>% epi_slide(before = 6 * days_dt, ~ sum(.x$value) + c(0, 0, 0)), - compute_slide_external(before = 6, overlap = TRUE) %>% arrange(time_value) + toy_edf %>% + filter(time_value %in% overlap_index) %>% + epi_slide(.window_size = 6 * days_dt, ~ sum(.x$value) + c(0, 0, 0)), + compute_slide_external(.window_size = 6, overlap = TRUE) %>% arrange(time_value) ) expect_equal( toy_edf %>% filter(time_value %in% overlap_index) %>% - epi_slide(before = 6 * days_dt, ~ as.list(sum(.x$value) + c(0, 0, 0))), - compute_slide_external(before = 6, overlap = TRUE) %>% + epi_slide(.window_size = 6 * days_dt, ~ as.list(sum(.x$value) + c(0, 0, 0))), + compute_slide_external(.window_size = 6, overlap = TRUE) %>% dplyr::mutate(slide_value = as.list(slide_value)) %>% arrange(time_value) ) expect_equal( toy_edf %>% filter(time_value %in% overlap_index) %>% - epi_slide(before = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value) + c(0, 0, 0))), - compute_slide_external(before = 6, overlap = TRUE) %>% arrange(time_value) + epi_slide(.window_size = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value) + c(0, 0, 0))), + compute_slide_external(.window_size = 6, overlap = TRUE) %>% arrange(time_value) ) # size-1 list is recycled: expect_equal( toy_edf %>% filter(time_value %in% overlap_index) %>% - epi_slide(before = 6 * days_dt, ~ list(tibble(value = sum(.x$value) + c(0, 0, 0)))), - compute_slide_external(before = 6, overlap = TRUE) %>% + epi_slide(.window_size = 6 * days_dt, ~ list(tibble(value = sum(.x$value) + c(0, 0, 0)))), + compute_slide_external(.window_size = 6, overlap = TRUE) %>% group_by(time_value) %>% mutate(slide_value = rep(list(tibble(value = slide_value)), 3L)) %>% ungroup() %>% @@ -526,69 +512,68 @@ test_that("non-size-1 f outputs are no-op recycled", { test_that("`epi_slide` doesn't lose Date class output", { expect_true( toy_edf %>% - epi_slide(before = 5 * days_dt, ~ as.Date("2020-01-01")) %>% + epi_slide(.window_size = 5 * days_dt, ~ as.Date("2020-01-01")) %>% `[[`("slide_value") %>% inherits("Date") ) }) -time_types <- c("days", "weeks", "yearmonths", "integers") -for (time_type in time_types) { - test_that(format_inline("epi_slide and epi_slide_mean: different before/after match for {time_type}"), { - set.seed(0) - n <- 16 - epi_data_no_missing <- rbind( - tibble(geo_value = "al", a = 1:n, b = rnorm(n)), - tibble(geo_value = "ca", a = n:1, b = rnorm(n) + 10), - tibble(geo_value = "fl", a = n:1, b = rnorm(n) * 2) - ) %>% - mutate( - time_value = rep( - switch(time_type, - days = as.Date("2022-01-01") + 1:n, - weeks = as.Date("2022-01-01") + 7L * 1:n, - yearmonths = tsibble::yearmonth(10L + 1:n), - integers = 2000L + 1:n, - ), 3 +for (time_type in c("days", "weeks", "yearmonths", "integers")) { + for (align in c("right", "center", "left")) { + for (window_size in c(1, 6)) { + test_that(format_inline( + "epi_slide and epi_slide_mean: equivalent for + .window_size={window_size}, time_type={time_type}, and .align={align}" + ), { + set.seed(0) + n <- 16 + epi_data_no_missing <- rbind( + tibble(geo_value = "al", a = 1:n, b = rnorm(n)), + tibble(geo_value = "ca", a = n:1, b = rnorm(n) + 10), + tibble(geo_value = "fl", a = n:1, b = rnorm(n) * 2) + ) %>% + mutate( + time_value = rep( + switch(time_type, + days = as.Date("2022-01-01") + 1:n, + weeks = as.Date("2022-01-01") + 7L * 1:n, + yearmonths = tsibble::yearmonth(10L + 1:n), + integers = 2000L + 1:n, + ), 3 + ) + ) %>% + as_epi_df() %>% + group_by(geo_value) + # Remove rows 12, 13, and 14 from every group + epi_data_missing <- epi_data_no_missing %>% slice(1:11, 15:16) + units <- switch(time_type, + days = days_dt, + weeks = weeks_dt, + yearmonths = 1, + integers = 1 ) - ) %>% - as_epi_df() %>% - group_by(geo_value) - # Remove rows 12, 13, and 14 from every group - epi_data_missing <- epi_data_no_missing %>% slice(1:11, 15:16) - - test_time_type_mean <- function(epi_data, before = NULL, after = NULL, ...) { - result1 <- epi_slide(epi_data, ~ data.frame( - slide_value_a = mean(.x$a, rm.na = TRUE), - slide_value_b = mean(.x$b, rm.na = TRUE) - ), - before = before, after = after, ... - ) - result2 <- epi_slide_mean(epi_data, col_names = c(a, b), na.rm = TRUE, before = before, after = after, ...) - expect_equal(result1, result2) - } - - units <- switch(time_type, - days = days_dt, - weeks = weeks_dt, - yearmonths = 1, - integers = 1 - ) + window_size <- window_size * units + + test_time_type_mean <- function(epi_data, ...) { + result1 <- epi_slide(epi_data, ~ data.frame( + slide_value_a = mean(.x$a, rm.na = TRUE), + slide_value_b = mean(.x$b, rm.na = TRUE) + ), + .window_size = window_size, .align = align, ... + ) + result2 <- epi_slide_mean( + epi_data, + .window_size = window_size, .align = align, + .col_names = c(a, b), na.rm = TRUE, ... + ) + expect_equal(result1, result2) + } - test_time_type_mean(epi_data_missing, before = 6 * units) - test_time_type_mean(epi_data_missing, before = 6 * units, after = 1 * units) - test_time_type_mean(epi_data_missing, before = 6 * units, after = 6 * units) - test_time_type_mean(epi_data_missing, before = 1 * units, after = 6 * units) - test_time_type_mean(epi_data_missing, after = 6 * units) - test_time_type_mean(epi_data_missing, after = 1 * units) - - test_time_type_mean(epi_data_no_missing, before = 6 * units) - test_time_type_mean(epi_data_no_missing, before = 6 * units, after = 1 * units) - test_time_type_mean(epi_data_no_missing, before = 6 * units, after = 6 * units) - test_time_type_mean(epi_data_no_missing, before = 1 * units, after = 6 * units) - test_time_type_mean(epi_data_no_missing, after = 6 * units) - test_time_type_mean(epi_data_no_missing, after = 1 * units) - }) + test_time_type_mean(epi_data_missing) + test_time_type_mean(epi_data_no_missing) + }) + } + } } test_that("helper `full_date_seq` returns expected date values", { @@ -724,20 +709,20 @@ test_that("helper `full_date_seq` returns expected date values", { test_that("epi_slide_mean/sum produces same output as epi_slide_opt grouped", { expect_equal( - epi_slide_mean(toy_edf_g, value, before = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(toy_edf_g, value, f = data.table::frollmean, before = 50 * days_dt, na.rm = TRUE) + epi_slide_mean(toy_edf_g, value, .window_size = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(toy_edf_g, value, .f = data.table::frollmean, .window_size = 50 * days_dt, na.rm = TRUE) ) expect_equal( - epi_slide_mean(toy_edf_g, value, before = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(toy_edf_g, value, f = slider::slide_mean, before = 50 * days_dt, na_rm = TRUE) + epi_slide_mean(toy_edf_g, value, .window_size = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(toy_edf_g, value, .f = slider::slide_mean, .window_size = 50 * days_dt, na_rm = TRUE) ) expect_equal( - epi_slide_sum(toy_edf_g, value, before = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(toy_edf_g, value, f = data.table::frollsum, before = 50 * days_dt, na.rm = TRUE) + epi_slide_sum(toy_edf_g, value, .window_size = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(toy_edf_g, value, .f = data.table::frollsum, .window_size = 50 * days_dt, na.rm = TRUE) ) expect_equal( - epi_slide_sum(toy_edf_g, value, before = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(toy_edf_g, value, f = slider::slide_sum, before = 50 * days_dt, na_rm = TRUE) + epi_slide_sum(toy_edf_g, value, .window_size = 50 * days_dt, na.rm = TRUE), + epi_slide_opt(toy_edf_g, value, .f = slider::slide_sum, .window_size = 50 * days_dt, na_rm = TRUE) ) }) @@ -746,15 +731,15 @@ test_that("`epi_slide_opt` errors when passed non-`data.table`, non-`slider` fun expect_no_error( epi_slide_opt( toy_edf_g, - col_names = value, f = reexport_frollmean, - before = days_dt, ref_time_values = test_date + 1 + .col_names = value, .f = reexport_frollmean, + .window_size = days_dt, .ref_time_values = test_date + 1 ) ) expect_error( epi_slide_opt( toy_edf_g, - col_names = value, f = mean, - before = days_dt, ref_time_values = test_date + 1 + .col_names = value, .f = mean, + .window_size = days_dt, .ref_time_values = test_date + 1 ), class = "epiprocess__epi_slide_opt__unsupported_slide_function" ) @@ -769,23 +754,23 @@ multi_columns <- dplyr::bind_rows( test_that("no dplyr warnings from selecting multiple columns", { expect_no_warning( - multi_slid <- epi_slide_mean(multi_columns, col_names = c("value", "value2"), before = 3L) + multi_slid <- epi_slide_mean(multi_columns, .col_names = c("value", "value2"), .window_size = 3L) ) expect_equal( names(multi_slid), c("geo_value", "time_value", "value", "value2", "slide_value_value", "slide_value_value2") ) expect_no_warning( - multi_slid_select <- epi_slide_mean(multi_columns, c(value, value2), before = 3L) + multi_slid_select <- epi_slide_mean(multi_columns, c(value, value2), .window_size = 3L) ) expect_equal(multi_slid_select, multi_slid) expect_no_warning( - multi_slid_select <- epi_slide_mean(multi_columns, starts_with("value"), before = 3L) + multi_slid_select <- epi_slide_mean(multi_columns, starts_with("value"), .window_size = 3L) ) expect_equal(multi_slid_select, multi_slid) }) -test_that("Inf works in before/after in slide and slide_opt", { +test_that("Inf works in .window_size in slide and slide_opt", { # Daily data df <- dplyr::bind_rows( dplyr::tibble(geo_value = "ak", time_value = test_date + 1:200, value = 1:200), @@ -796,13 +781,13 @@ test_that("Inf works in before/after in slide and slide_opt", { df %>% group_by(geo_value) %>% epi_slide( - before = Inf, + .window_size = Inf, slide_value = sum(value) ), df %>% group_by(geo_value) %>% epi_slide( - before = 365000, + .window_size = 365000, slide_value = sum(value) ) ) @@ -810,14 +795,14 @@ test_that("Inf works in before/after in slide and slide_opt", { df %>% group_by(geo_value) %>% epi_slide_opt( - before = Inf, - f = data.table::frollsum, - col_names = value + .window_size = Inf, + .f = data.table::frollsum, + .col_names = value ), df %>% group_by(geo_value) %>% epi_slide( - before = 365000, + .window_size = 365000, slide_value_value = sum(value) ) ) @@ -825,14 +810,14 @@ test_that("Inf works in before/after in slide and slide_opt", { df %>% group_by(geo_value) %>% epi_slide_opt( - before = Inf, - f = slider::slide_sum, - col_names = value + .window_size = Inf, + .f = slider::slide_sum, + .col_names = value ), df %>% group_by(geo_value) %>% epi_slide( - before = 365000, + .window_size = 365000, slide_value_value = sum(value) ) ) @@ -848,13 +833,13 @@ test_that("Inf works in before/after in slide and slide_opt", { df %>% group_by(geo_value) %>% epi_slide( - before = Inf, + .window_size = Inf, slide_value = sum(value) ), df %>% group_by(geo_value) %>% epi_slide( - before = 365000 * weeks_dt, + .window_size = 365000 * weeks_dt, slide_value = sum(value) ) ) @@ -862,14 +847,14 @@ test_that("Inf works in before/after in slide and slide_opt", { df %>% group_by(geo_value) %>% epi_slide_opt( - col_names = value, - f = data.table::frollsum, - before = Inf + .col_names = value, + .f = data.table::frollsum, + .window_size = Inf ), df %>% group_by(geo_value) %>% epi_slide( - before = 365000 * weeks_dt, + .window_size = 365000 * weeks_dt, slide_value_value = sum(value) ) ) @@ -877,14 +862,14 @@ test_that("Inf works in before/after in slide and slide_opt", { df %>% group_by(geo_value) %>% epi_slide_opt( - before = Inf, - f = slider::slide_sum, - col_names = value + .window_size = Inf, + .f = slider::slide_sum, + .col_names = value ), df %>% group_by(geo_value) %>% epi_slide( - before = 365000 * weeks_dt, + .window_size = 365000 * weeks_dt, slide_value_value = sum(value) ) ) diff --git a/vignettes/advanced.Rmd b/vignettes/advanced.Rmd index 3eaafb8d..93dfb361 100644 --- a/vignettes/advanced.Rmd +++ b/vignettes/advanced.Rmd @@ -46,22 +46,16 @@ These differences in basic behavior make some common slide operations require le When using more advanced features, more complex rules apply: -* Generalization: `epi_slide(edf, ....., ref_time_values=my_ref_time_values)` +* Generalization: `epi_slide(edf, ....., .ref_time_values=my_ref_time_values)` will output one row for every row in `edf` with `time_value` appearing inside `my_ref_time_values`, and is analogous to a `dplyr::mutate`&`dplyr::arrange` - followed by `dplyr::filter` to those `ref_time_values`. We call this property + followed by `dplyr::filter` to those `.ref_time_values`. We call this property **size stability**, and describe how it is achieved in the following sections. The default behavior described above is a special case of this general rule - based on a default value of `ref_time_values`. -* Exception/feature: `epi_slide(edf, ....., ref_time_values=my_ref_time_values, - all_rows=TRUE)` will not just output rows for `my_ref_time_values`, but + based on a default value of `.ref_time_values`. +* Exception/feature: `epi_slide(edf, ....., .ref_time_values=my_ref_time_values, + .all_rows=TRUE)` will not just output rows for `my_ref_time_values`, but instead will output one row per row in `edf`. -* Exception/feature: `epi_slide(edf, ....., as_list_col=TRUE)` will format the - output to add a single list-class computed column. -* Exception/feature: `epix_slide(ea, ....., as_list_col=TRUE)` will format the - output to have one row per computation and a single list-class computed column - (in addition to the grouping variables and `time_value`), as if we had used - `tidyr::chop()` or `tidyr::nest()`. * Clarification: `ea %>% group_by(....., .drop=FALSE) %>% epix_slide(, .....)` will call the computation on any missing groups according to `dplyr`'s `.drop=FALSE` rules, resulting in additional @@ -94,18 +88,18 @@ edf <- tibble( # 2-day trailing average, per geo value edf %>% group_by(geo_value) %>% - epi_slide(x_2dav = mean(x), before = 1) %>% + epi_slide(x_2dav = mean(x), .window_size = 2) %>% ungroup() # 2-day trailing average, marginally edf %>% - epi_slide(x_2dav = mean(x), before = 1) + epi_slide(x_2dav = mean(x), .window_size = 2) ``` ```{r, include = FALSE} # More checks (not included) edf %>% - epi_slide(x_2dav = mean(x), before = 1, ref_time_values = as.Date("2020-06-02")) + epi_slide(x_2dav = mean(x), .window_size = 2, .ref_time_values = as.Date("2020-06-02")) edf %>% # pretend that observations about time_value t are reported in version t (nowcasts) @@ -131,7 +125,7 @@ same result as the last one. ```{r} edf %>% - epi_slide(y_2dav = rep(mean(x), 3), before = 1) + epi_slide(y_2dav = rep(mean(x), 3), .window_size = 2) ``` However, if the output is an atomic vector (rather than a single value) and it @@ -140,7 +134,7 @@ are trying to return 2 things for 3 states. ```{r, error = TRUE} edf %>% - epi_slide(x_2dav = rep(mean(x), 2), before = 1) + epi_slide(x_2dav = rep(mean(x), 2), .window_size = 2) ``` ## Multi-column outputs @@ -148,16 +142,14 @@ edf %>% Now we move on to outputs that are data frames with a single row but multiple columns. Working with this type of output structure has in fact has already been demonstrated in the [slide -vignette](https://cmu-delphi.github.io/epiprocess/articles/slide.html). When -we set `as_list_col = TRUE` in the call to `epi_slide()`, the resulting `epi_df` -object returned by `epi_slide()` has a list column containing the slide values. +vignette](https://cmu-delphi.github.io/epiprocess/articles/slide.html). ```{r} edf2 <- edf %>% group_by(geo_value) %>% epi_slide( - a = data.frame(x_2dav = mean(x), x_2dma = mad(x)), - before = 1, as_list_col = TRUE + a = list(data.frame(x_2dav = mean(x), x_2dma = mad(x))), + .window_size = 2 ) %>% ungroup() @@ -166,66 +158,32 @@ length(edf2$a) edf2$a[[2]] ``` -When we use `as_list_col = FALSE` (the default in `epi_slide()`), the function -unnests (in the sense of `tidyr::unnest()`) the list column `a`, so that the -resulting `epi_df` has multiple new columns containing the slide values. The -default is to name these unnested columns by prefixing the name assigned to the -list column (here `a`) onto the column names of the output data frame from the -slide computation (here `x_2dav` and `x_2dma`) separated by "_". - -```{r} -edf %>% - group_by(geo_value) %>% - epi_slide( - a = data.frame(x_2dav = mean(x), x_2dma = mad(x)), - before = 1, as_list_col = FALSE - ) %>% - ungroup() -``` - -We can use `names_sep = NULL` (which gets passed to `tidyr::unnest()`) to drop -the prefix associated with list column name, in naming the unnested columns. +If you do not wrap the data.frame in a list above, the resulting `epi_df` has +multiple new columns containing the slide values. The default is to name these +unnested columns by prefixing the name assigned to the list column (here `a`) +onto the column names of the output data frame from the slide computation (here +`x_2dav` and `x_2dma`) separated by "_". ```{r} edf %>% group_by(geo_value) %>% epi_slide( a = data.frame(x_2dav = mean(x), x_2dma = mad(x)), - before = 1, as_list_col = FALSE, names_sep = NULL + .window_size = 2 ) %>% ungroup() ``` Furthermore, `epi_slide()` will recycle the single row data frame as needed in -order to make the result size stable, just like the case for atomic values. +order to make the result size stable, just like the case for atomic values (note +that we are not grouping here by geo_value). ```{r} edf %>% epi_slide( a = data.frame(x_2dav = mean(x), x_2dma = mad(x)), - before = 1, as_list_col = FALSE, names_sep = NULL - ) -``` - -```{r, include = FALSE} -# More checks (not included) -edf %>% - epi_slide( - a = data.frame(x_2dav = mean(x), x_2dma = mad(x)), - ref_time_values = as.Date("2020-06-02"), - before = 1, as_list_col = FALSE, names_sep = NULL + .window_size = 2 ) - -edf %>% - mutate(version = time_value) %>% - as_epi_archive() %>% - group_by(geo_value) %>% - epix_slide( - a = data.frame(x_2dav = mean(x), x_2dma = mad(x)), - ref_time_values = as.Date("2020-06-02"), - before = 1, as_list_col = FALSE, names_sep = NULL - ) %>% - ungroup() ``` ## Multi-row outputs @@ -250,16 +208,14 @@ edf %>% epi_slide(function(d, group_key, ref_time_value) { obj <- lm(y ~ x, data = d) return( - as.data.frame( - predict(obj, - newdata = d %>% - group_by(geo_value) %>% - filter(time_value == max(time_value)), - interval = "prediction", level = 0.9 - ) - ) + predict( + obj, + newdata = d %>% group_by(geo_value) %>% filter(time_value == max(time_value)), + interval = "prediction", + level = 0.9 + ) %>% as.data.frame() %>% list() ) - }, before = 1, new_col_name = "fc", names_sep = NULL) + }, .window_size = 2) ``` The above example focused on simplicity to show how to work with multi-row @@ -471,7 +427,7 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, .data$geo_value, .data$time_value, args = prob_arx_args(ahead = ahead) ), - before = 119, ref_time_values = fc_time_values + before = 219, ref_time_values = fc_time_values ) %>% mutate( target_date = .data$time_value + ahead, as_of = TRUE, @@ -483,7 +439,7 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, .data$geo_value, .data$time_value, args = prob_arx_args(ahead = ahead) ), - before = 119, ref_time_values = fc_time_values + .window_size = 220, .ref_time_values = fc_time_values ) %>% mutate(target_date = .data$time_value + ahead, as_of = FALSE) } diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index ec5f36af..585b5b0a 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -182,7 +182,7 @@ Explicit imputation for missingness (zero-filling in our case) can be important for protecting against bugs in all sorts of downstream tasks. For example, even something as simple as a 7-day trailing average is complicated by missingness. The function `epi_slide()` looks for all rows within a window of 7 days anchored -on the right at the reference time point (when `before = 6`). +on the right at the reference time point (when `.window_size = 7`). But when some days in a given week are missing because they were censored because they had small case counts, taking an average of the observed case counts can be misleading and is unintentionally biased upwards. Meanwhile, @@ -194,7 +194,7 @@ running `epi_slide()` on the zero-filled data brings these trailing averages xt %>% as_epi_df(as_of = as.Date("2024-03-20")) %>% group_by(geo_value) %>% - epi_slide(cases_7dav = mean(cases), before = 6) %>% + epi_slide(cases_7dav = mean(cases), .window_size = 7) %>% ungroup() %>% filter( geo_value == "Plymouth, MA", @@ -205,7 +205,7 @@ xt %>% xt_filled %>% as_epi_df(as_of = as.Date("2024-03-20")) %>% group_by(geo_value) %>% - epi_slide(cases_7dav = mean(cases), before = 6) %>% + epi_slide(cases_7dav = mean(cases), .window_size = 7) %>% ungroup() %>% filter( geo_value == "Plymouth, MA", diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index ff37f7cc..3d616d92 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -128,7 +128,7 @@ object is instantiated, if they are not explicitly specified in the function call (as it did in the case above). ## Summarizing Revision Behavior -There are many ways to examine the ways that signals change across different revisions. +There are many ways to examine the ways that signals change across different revisions. The simplest that is included directly in epiprocess is `revision_summary()`, which computes simple summary statistics for each key (by default, `(geo_value,time_value)` pairs), such as the lag to the first value (latency). In addition to the per key summary, it also returns an overall summary: ```{r} revision_details <- revision_summary(x, print_inform = TRUE) @@ -402,8 +402,8 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { x_latest %>% group_by(.data$geo_value) %>% epi_slide( - fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, ahead = ahead), before = 119, - ref_time_values = fc_time_values + fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, ahead = ahead), .window_size = 120, + .ref_time_values = fc_time_values ) %>% mutate(target_date = .data$time_value + ahead, as_of = FALSE) %>% ungroup() diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 8264a963..892b6cca 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -20,8 +20,7 @@ understands addition and subtraction. For example, if the time values are coded as `Date` objects, then one time step is one day, since `as.Date("2022-01-01") + 1` equals `as.Date("2022-01-02")`. Alternatively, the time step can be specified manually in the call to `epi_slide()`; you can read the documentation for more -details. Furthermore, the alignment of the running window used in `epi_slide()` -is specified by `before` and `after`. +details. As in getting started guide, we'll fetch daily reported COVID-19 cases from CA, FL, NY, and TX (note: here we're using new, not cumulative cases) using the @@ -70,7 +69,7 @@ first call `group_by()`. ```{r} x %>% group_by(geo_value) %>% - epi_slide_mean("cases", before = 6) %>% + epi_slide_mean("cases", .window_size = 7) %>% ungroup() %>% head(10) ``` @@ -91,7 +90,7 @@ first call `group_by()`. ```{r} x %>% group_by(geo_value) %>% - epi_slide(~ mean(.x$cases), before = 6) %>% + epi_slide(~ mean(.x$cases), .window_size = 7) %>% ungroup() %>% head(10) ``` @@ -101,12 +100,12 @@ original `epi_df` object (and must refer to them with the prefix `.x$`). As we can see, the function `epi_slide()` returns an `epi_df` object with a new column appended that contains the results (from sliding), named `slide_value` as the default. We can of course change this post hoc, or we can instead specify a new -name up front using the `new_col_name` argument: +name up front using the `.new_col_name` argument: ```{r} x <- x %>% group_by(geo_value) %>% - epi_slide(~ mean(.x$cases), before = 6, new_col_name = "cases_7dav") %>% + epi_slide(~ mean(.x$cases), .window_size = 7, .new_col_name = "cases_7dav") %>% ungroup() head(x, 10) @@ -127,20 +126,20 @@ instead of `.ref_time_value`. We can also pass a function for the first argument in `epi_slide()`. In this case, the passed function must accept the following arguments: -In this case, the passed function `f` must accept the following arguments: a +In this case, the passed function `.f` must accept the following arguments: a data frame with the same column names as the original object, minus any grouping -variables, containing the time window data for one group-`ref_time_value` +variables, containing the time window data for one group-`.ref_time_value` combination; followed by a one-row tibble containing the values of the grouping -variables for the associated group; followed by the associated `ref_time_value`. +variables for the associated group; followed by the associated `.ref_time_value`. It can accept additional arguments; `epi_slide()` will forward any `...` args it -receives to `f`. +receives to `.f`. Recreating the last example of a 7-day trailing average: ```{r} x <- x %>% group_by(geo_value) %>% - epi_slide(function(x, gk, rtv) mean(x$cases), before = 6, new_col_name = "cases_7dav") %>% + epi_slide(function(x, gk, rtv) mean(x$cases), .window_size = 7, .new_col_name = "cases_7dav") %>% ungroup() head(x, 10) @@ -151,13 +150,13 @@ head(x, 10) Perhaps the most convenient way to setup a computation in `epi_slide()` is to pass in an expression for tidy evaluation. In this case, we can simply define the name of the new column directly as part of the expression, setting it equal -to a computation in which we can access any columns of `x` by name, just as we +to a computation in which we can access any columns of `.x` by name, just as we would in a call to `dplyr::mutate()`, or any of the `dplyr` verbs. For example: ```{r} x <- x %>% group_by(geo_value) %>% - epi_slide(cases_7dav = mean(cases), before = 6) %>% + epi_slide(cases_7dav = mean(cases), .window_size = 7) %>% ungroup() head(x, 10) @@ -254,14 +253,14 @@ fc_time_values <- seq(as.Date("2020-06-01"), x %>% group_by(geo_value) %>% epi_slide( - fc = prob_ar(cases_7dav), before = 119, - ref_time_values = fc_time_values + fc = prob_ar(cases_7dav), .window_size = 120, + .ref_time_values = fc_time_values ) %>% ungroup() %>% head(10) ``` -Note that here we have utilized an argument `ref_time_values` to perform the +Note that here we have utilized an argument `.ref_time_values` to perform the sliding computation (here, compute a forecast) at a specific subset of reference time values. We get out a ["packed"][tidyr::pack] data frame column `fc` containing `fc$point`, `fc$lower`, and `fc$upper` that correspond to the point @@ -282,8 +281,8 @@ k_week_ahead <- function(x, ahead = 7) { x %>% group_by(.data$geo_value) %>% epi_slide( - fc = prob_ar(.data$cases_7dav, ahead = ahead), before = 119, - ref_time_values = fc_time_values, all_rows = TRUE + fc = prob_ar(.data$cases_7dav, ahead = ahead), + .window_size = 120, .ref_time_values = fc_time_values, .all_rows = TRUE ) %>% ungroup() %>% mutate(target_date = .data$time_value + ahead) From b3934918036ecd7c0962cfb7e6743c0c2be26327 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Thu, 22 Aug 2024 18:59:42 -0700 Subject: [PATCH 050/110] lint: lint --- vignettes/advanced.Rmd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vignettes/advanced.Rmd b/vignettes/advanced.Rmd index 93dfb361..d712b991 100644 --- a/vignettes/advanced.Rmd +++ b/vignettes/advanced.Rmd @@ -213,7 +213,9 @@ edf %>% newdata = d %>% group_by(geo_value) %>% filter(time_value == max(time_value)), interval = "prediction", level = 0.9 - ) %>% as.data.frame() %>% list() + ) %>% + as.data.frame() %>% + list() ) }, .window_size = 2) ``` From 9c4c49ddc7ed27238cfcc8ee04d66994264638ea Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Thu, 22 Aug 2024 19:01:08 -0700 Subject: [PATCH 051/110] doc: doc --- man-roxygen/opt-slide-details.R | 18 +++++++++--------- man/epi_slide_mean.Rd | 18 +++++++++--------- man/epi_slide_opt.Rd | 18 +++++++++--------- man/epi_slide_sum.Rd | 18 +++++++++--------- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/man-roxygen/opt-slide-details.R b/man-roxygen/opt-slide-details.R index f78a33db..a8d93d93 100644 --- a/man-roxygen/opt-slide-details.R +++ b/man-roxygen/opt-slide-details.R @@ -12,22 +12,22 @@ #' specified function or formula `f`, or through post-processing. #' #' Let's look at some window examples, assuming that the reference time value -#' is `tv`. With .align = "right" and .window_size = 3, the window will be: +#' is "tv". With .align = "right" and .window_size = 3, the window will be: #' -#' time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -#' window: [tv - 2, tv - 1, tv] +#' time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: tv - 2, tv - 1, tv #' #' With .align = "center" and .window_size = 3, the window will be: #' -#' time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -#' window: [tv - 1, tv, tv + 1] +#' time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: tv - 1, tv, tv + 1 #' #' With .align = "center" and .window_size = 4, the window will be: #' -#' time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -#' window: [tv - 2, tv - 1, tv, tv + 1] +#' time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: tv - 2, tv - 1, tv, tv + 1 #' #' With .align = "left" and .window_size = 3, the window will be: #' -#' time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -#' window: [tv, tv + 1, tv + 2] +#' time_values: ttv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +#' window: tv, tv + 1, tv + 2 diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index 3412f5a3..820292ad 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -94,25 +94,25 @@ incomplete windows) is therefore left up to the user, either through the specified function or formula \code{f}, or through post-processing. Let's look at some window examples, assuming that the reference time value -is \code{tv}. With .align = "right" and .window_size = 3, the window will be: +is "tv". With .align = "right" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 2, tv - 1, tv} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 2, tv - 1, tv With .align = "center" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 1, tv, tv + 1} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 1, tv, tv + 1 With .align = "center" and .window_size = 4, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 2, tv - 1, tv, tv + 1} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 2, tv - 1, tv, tv + 1 With .align = "left" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv, tv + 1, tv + 2} +time_values: ttv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv, tv + 1, tv + 2 } \examples{ # slide a 7-day trailing average formula on cases diff --git a/man/epi_slide_opt.Rd b/man/epi_slide_opt.Rd index e9ea1a8c..7fc54b7e 100644 --- a/man/epi_slide_opt.Rd +++ b/man/epi_slide_opt.Rd @@ -109,25 +109,25 @@ incomplete windows) is therefore left up to the user, either through the specified function or formula \code{f}, or through post-processing. Let's look at some window examples, assuming that the reference time value -is \code{tv}. With .align = "right" and .window_size = 3, the window will be: +is "tv". With .align = "right" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 2, tv - 1, tv} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 2, tv - 1, tv With .align = "center" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 1, tv, tv + 1} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 1, tv, tv + 1 With .align = "center" and .window_size = 4, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 2, tv - 1, tv, tv + 1} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 2, tv - 1, tv, tv + 1 With .align = "left" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv, tv + 1, tv + 2} +time_values: ttv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv, tv + 1, tv + 2 } \examples{ # slide a 7-day trailing average formula on cases. This can also be done with `epi_slide_mean` diff --git a/man/epi_slide_sum.Rd b/man/epi_slide_sum.Rd index 20b6abc2..3c7baedc 100644 --- a/man/epi_slide_sum.Rd +++ b/man/epi_slide_sum.Rd @@ -94,25 +94,25 @@ incomplete windows) is therefore left up to the user, either through the specified function or formula \code{f}, or through post-processing. Let's look at some window examples, assuming that the reference time value -is \code{tv}. With .align = "right" and .window_size = 3, the window will be: +is "tv". With .align = "right" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 2, tv - 1, tv} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 2, tv - 1, tv With .align = "center" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 1, tv, tv + 1} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 1, tv, tv + 1 With .align = "center" and .window_size = 4, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv - 2, tv - 1, tv, tv + 1} +time_values: tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv - 2, tv - 1, tv, tv + 1 With .align = "left" and .window_size = 3, the window will be: -time_values: tv - 4, tv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 -window: \link{tv, tv + 1, tv + 2} +time_values: ttv - 3, tv - 2, tv - 1, tv, tv + 1, tv + 2, tv + 3 +window: tv, tv + 1, tv + 2 } \examples{ # slide a 7-day trailing sum formula on cases From 57cda93dbb66f14be5600054cf0df6e51309c705 Mon Sep 17 00:00:00 2001 From: Daniel McDonald Date: Fri, 23 Aug 2024 10:33:53 -0700 Subject: [PATCH 052/110] feat: other_keys as arg in epi_df, epi_archive (#512) * change epi_df and epi_archive constructors * remove additional_metadata from both epi_df and epi_archive * adjust printing for both methods * fix unknown TZ warning * fix vignettes, docs * clean up DESCRIPTION * no need to collate without R6 * fix incomplete merge * chore: regenerate data Co-authored-by: Dmitry Shemetov Co-authored-by: dajmcdon Co-authored-by: brookslogan --- DESCRIPTION | 34 +++++----- NEWS.md | 15 +++-- R/archive.R | 29 ++++----- R/epi_df.R | 75 +++++++++++----------- R/methods-epi_archive.R | 24 +------ R/methods-epi_df.R | 17 +++-- R/slide.R | 6 +- R/sysdata.rda | Bin 709873 -> 709944 bytes data/incidence_num_outlier_example.rda | Bin 3213 -> 3221 bytes data/jhu_csse_county_level_subset.rda | Bin 20371 -> 20325 bytes data/jhu_csse_daily_subset.rda | Bin 81174 -> 81230 bytes man/epi_archive.Rd | 15 ++--- man/epi_df.Rd | 68 +++++++++++--------- man/epi_slide_mean.Rd | 2 +- man/epi_slide_opt.Rd | 2 +- man/epi_slide_sum.Rd | 2 +- man/epix_merge.Rd | 5 +- tests/testthat/test-archive.R | 46 ++++++------- tests/testthat/test-arrange-canonical.R | 8 ++- tests/testthat/test-epi_df.R | 14 ++-- tests/testthat/test-epix_merge.R | 20 ------ tests/testthat/test-grouped_epi_archive.R | 2 +- tests/testthat/test-methods-epi_df.R | 19 +++--- tests/testthat/test-utils.R | 4 +- vignettes/archive.Rmd | 1 - vignettes/epiprocess.Rmd | 6 +- 26 files changed, 190 insertions(+), 224 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 81f1871e..e77f331a 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -4,7 +4,7 @@ Title: Tools for basic signal processing in epidemiology Version: 0.8.5 Authors@R: c( person("Jacob", "Bien", role = "ctb"), - person("Logan", "Brooks", email = "lcbrooks@andrew.cmu.edu", role = c("aut", "cre")), + person("Logan", "Brooks", , "lcbrooks@andrew.cmu.edu", role = c("aut", "cre")), person("Rafael", "Catoia", role = "ctb"), person("Nat", "DeFries", role = "ctb"), person("Daniel", "McDonald", role = "aut"), @@ -15,16 +15,22 @@ Authors@R: c( person("Evan", "Ray", role = "aut"), person("Dmitry", "Shemetov", role = "ctb"), person("Ryan", "Tibshirani", role = "aut"), - person("Lionel", "Henry", role = "ctb", comment = "Author of included rlang fragments"), - person("Hadley", "Wickham", role = "ctb", comment = "Author of included rlang fragments"), - person("Posit", role = "cph", comment = "Copyright holder of included rlang fragments") + person("Lionel", "Henry", role = "ctb", + comment = "Author of included rlang fragments"), + person("Hadley", "Wickham", role = "ctb", + comment = "Author of included rlang fragments"), + person("Posit", role = "cph", + comment = "Copyright holder of included rlang fragments") ) -Description: This package introduces a common data structure for epidemiological - data reported by location and time, provides another data structure to - work with revisions to these data sets over time, and offers associated - utilities to perform basic signal processing tasks. +Description: This package introduces a common data structure for + epidemiological data reported by location and time, provides another + data structure to work with revisions to these data sets over time, + and offers associated utilities to perform basic signal processing + tasks. License: MIT + file LICENSE -Copyright: file inst/COPYRIGHTS +URL: https://cmu-delphi.github.io/epiprocess/ +Depends: + R (>= 3.6) Imports: checkmate, cli, @@ -58,18 +64,16 @@ VignetteBuilder: knitr Remotes: cmu-delphi/epidatr, - reconverse/outbreaks, - glmgen/genlasso + glmgen/genlasso, + reconverse/outbreaks Config/testthat/edition: 3 Config/testthat/parallel: true +Copyright: file inst/COPYRIGHTS Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 -Depends: - R (>= 2.10) -URL: https://cmu-delphi.github.io/epiprocess/ -Collate: +Collate: 'archive.R' 'autoplot.R' 'correlation.R' diff --git a/NEWS.md b/NEWS.md index 5b231126..8bdb8c47 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,7 +5,8 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat # epiprocess 0.9 ## Breaking changes -- In `epi[x]_slide`: + +- In `epi[x]_slide` - `names_sep` is deprecated, and if you return data frames from your computations, they will no longer be unpacked into separate columns with name prefixes; instead: @@ -15,12 +16,18 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat packed data.frame-class column (see `tidyr::pack`). - `as_list_col` is deprecated; you can now directly return a list from your slide computations instead. +- `additional_metadata` is no longer accepted in `as_epi_df()` or + `as_epi_archive()`. Use the new `other_keys` arg to specify additional key + columns, such as age group columns or other demographic breakdowns. + Miscellaneous metadata are no longer handled by `epiprocess`, but you can use + R's built-in `attr<-` instead for a similar feature. ## Improvements - Added `complete.epi_df`, which fills in missing values in an `epi_df` with `NA`s. Uses `tidyr::complete` underneath and preserves `epi_df` metadata. -- Inclusion of the function `revision_summary` to provide basic revision information for `epi_archive`s out of the box. (#492) +- Inclusion of the function `revision_summary` to provide basic revision + information for `epi_archive`s out of the box. (#492) ## Bug fixes @@ -87,8 +94,8 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat - Multiple "data-masking" tidy evaluation expressions can be passed in via `...`, rather than just one. - Additional tidy evaluation features from `dplyr::mutate` are supported: `!! - name_var := value`, unnamed expressions evaluating to data frames, and `= - NULL`; see `?epi_slide` for more details. +name_var := value`, unnamed expressions evaluating to data frames, and `= +NULL`; see `?epi_slide` for more details. ## Cleanup diff --git a/R/archive.R b/R/archive.R index eb66e364..fbcc3c36 100644 --- a/R/archive.R +++ b/R/archive.R @@ -179,7 +179,8 @@ NULL #' #' * `geo_type`: the type for the geo values. #' * `time_type`: the type for the time values. -#' * `additional_metadata`: list of additional metadata for the data archive. +#' * `other_keys`: any additional keys as a character vector. +#' Typical examples are "age" or sub-geographies. #' #' While this metadata is not protected, it is generally recommended to treat it #' as read-only, and to use the `epi_archive` methods to interact with the data @@ -209,10 +210,8 @@ NULL #' if the time type is not recognized. #' @param other_keys Character vector specifying the names of variables in `x` #' that should be considered key variables (in the language of `data.table`) -#' apart from "geo_value", "time_value", and "version". -#' @param additional_metadata List of additional metadata to attach to the -#' `epi_archive` object. The metadata will have the `geo_type` field; named -#' entries from the passed list or will be included as well. +#' apart from "geo_value", "time_value", and "version". Typical examples +#' are "age" or more granular geographies. #' @param compactify Optional; Boolean. `TRUE` will remove some #' redundant rows, `FALSE` will not, and missing or `NULL` will remove #' redundant rows, but issue a warning. See more information at `compactify`. @@ -293,7 +292,6 @@ new_epi_archive <- function( geo_type, time_type, other_keys, - additional_metadata, compactify, clobberable_versions_start, versions_end, @@ -350,7 +348,7 @@ new_epi_archive <- function( DT = compactified, geo_type = geo_type, time_type = time_type, - additional_metadata = additional_metadata, + other_keys = other_keys, clobberable_versions_start = clobberable_versions_start, versions_end = versions_end ), @@ -423,7 +421,6 @@ is_locf <- function(vec, tolerance) { # nolint: object_usage_linter validate_epi_archive <- function( x, other_keys, - additional_metadata, compactify, clobberable_versions_start, versions_end) { @@ -434,9 +431,6 @@ validate_epi_archive <- function( if (any(c("geo_value", "time_value", "version") %in% other_keys)) { cli_abort("`other_keys` cannot contain \"geo_value\", \"time_value\", or \"version\".") } - if (any(names(additional_metadata) %in% c("geo_type", "time_type"))) { - cli_warn("`additional_metadata` names overlap with existing metadata fields \"geo_type\" or \"time_type\".") - } # Conduct checks and apply defaults for `compactify` assert_logical(compactify, len = 1, any.missing = FALSE, null.ok = TRUE) @@ -485,8 +479,7 @@ as_epi_archive <- function( x, geo_type = deprecated(), time_type = deprecated(), - other_keys = character(0L), - additional_metadata = list(), + other_keys = character(), compactify = NULL, clobberable_versions_start = NA, .versions_end = max_version_with_row_in(x), ..., @@ -518,11 +511,10 @@ as_epi_archive <- function( time_type <- guess_time_type(x$time_value) validate_epi_archive( - x, other_keys, additional_metadata, - compactify, clobberable_versions_start, versions_end + x, other_keys, compactify, clobberable_versions_start, versions_end ) new_epi_archive( - x, geo_type, time_type, other_keys, additional_metadata, + x, geo_type, time_type, other_keys, compactify, clobberable_versions_start, versions_end ) } @@ -551,7 +543,7 @@ print.epi_archive <- function(x, ..., class = TRUE, methods = TRUE) { c( ">" = if (class) "An `epi_archive` object, with metadata:", "i" = if (length(setdiff(key(x$DT), c("geo_value", "time_value", "version"))) > 0) { - "Non-standard DT keys: {setdiff(key(x$DT), c('geo_value', 'time_value', 'version'))}" + "Other DT keys: {setdiff(key(x$DT), c('geo_value', 'time_value', 'version'))}" }, "i" = if (nrow(x$DT) != 0L) { "Min/max time values: {min(x$DT$time_value)} / {max(x$DT$time_value)}" @@ -687,7 +679,8 @@ print.epi_archive <- function(x, ..., class = TRUE, methods = TRUE) { #' @export #' #' @aliases grouped_epi_archive -group_by.epi_archive <- function(.data, ..., .add = FALSE, .drop = dplyr::group_by_drop_default(.data)) { +group_by.epi_archive <- function(.data, ..., .add = FALSE, + .drop = dplyr::group_by_drop_default(.data)) { # `add` makes no difference; this is an ungrouped `epi_archive`. detailed_mutate <- epix_detailed_restricted_mutate(.data, ...) assert_logical(.drop) diff --git a/R/epi_df.R b/R/epi_df.R index 56424bf0..fedcff55 100644 --- a/R/epi_df.R +++ b/R/epi_df.R @@ -127,7 +127,7 @@ #' dplyr::rename(geo_value = state, time_value = reported_date) %>% #' as_epi_df( #' as_of = "2020-06-03", -#' additional_metadata = list(other_keys = "pol") +#' other_keys = "pol" #' ) #' #' attr(ex2, "metadata") @@ -146,47 +146,46 @@ #' state = rep("MA", 6), #' pol = rep(c("blue", "swing", "swing"), each = 2) #' ) %>% -#' # the 2 extra keys we added have to be specified in the other_keys -#' # component of additional_metadata. -#' as_epi_df(additional_metadata = list(other_keys = c("state", "pol"))) +#' as_epi_df(other_keys = c("state", "pol")) #' #' attr(ex3, "metadata") NULL -#' Create an `epi_df` object -#' -#' @rdname epi_df -#' @param geo_type DEPRECATED Has no effect. Geo value type is inferred from the -#' location column and set to "custom" if not recognized. -#' @param time_type DEPRECATED Has no effect. Time value type inferred from the time -#' column and set to "custom" if not recognized. Unpredictable behavior may result -#' if the time type is not recognized. +#' @describeIn epi_df Lower-level constructor for `epi_df` object +#' @order 2 +#' @param geo_type `r lifecycle::badge("deprecated")` in `as_epi_df()`, has no +#' effect; the geo value type is inferred from the location column and set to +#' "custom" if not recognized. In `new_epi_df()`, should be set to the same +#' value that would be inferred. +#' @param time_type `r lifecycle::badge("deprecated")` in `as_epi_df()`, has no +#' effect: the time value type inferred from the time column and set to +#' "custom" if not recognized. Unpredictable behavior may result if the time +#' type is not recognized. In `new_epi_df()`, should be set to the same value +#' that would be inferred. #' @param as_of Time value representing the time at which the given data were #' available. For example, if `as_of` is January 31, 2022, then the `epi_df` #' object that is created would represent the most up-to-date version of the #' data available as of January 31, 2022. If the `as_of` argument is missing, #' then the current day-time will be used. -#' @param additional_metadata List of additional metadata to attach to the -#' `epi_df` object. The metadata will have `geo_type`, `time_type`, and -#' `as_of` fields; named entries from the passed list will be included as -#' well. If your tibble has additional keys, be sure to specify them as a -#' character vector in the `other_keys` component of `additional_metadata`. +#' @param other_keys If your tibble has additional keys, be sure to specify them +#' as a character vector here (typical examples are "age" or sub-geographies). #' @param ... Additional arguments passed to methods. #' @return An `epi_df` object. #' #' @export -new_epi_df <- function(x = tibble::tibble(), geo_type, time_type, as_of, - additional_metadata = list()) { +new_epi_df <- function(x = tibble::tibble(geo_value = character(), time_value = as.Date(integer())), + geo_type, time_type, as_of, + other_keys = character(), ...) { # Define metadata fields metadata <- list() metadata$geo_type <- geo_type metadata$time_type <- time_type metadata$as_of <- as_of - metadata <- c(metadata, additional_metadata) + metadata$other_keys <- other_keys # Reorder columns (geo_value, time_value, ...) if (sum(dim(x)) != 0) { - cols_to_put_first <- c("geo_value", "time_value") + cols_to_put_first <- c("geo_value", "time_value", other_keys) x <- x[, c( cols_to_put_first, # All other columns @@ -200,7 +199,8 @@ new_epi_df <- function(x = tibble::tibble(), geo_type, time_type, as_of, return(x) } -#' @rdname epi_df +#' @describeIn epi_df The preferred way of constructing `epi_df`s +#' @order 1 #' @param x An `epi_df`, `data.frame`, [tibble::tibble], or [tsibble::tsibble] #' to be converted #' @param ... used for specifying column names, as in [`dplyr::rename`]. For @@ -211,6 +211,7 @@ as_epi_df <- function(x, ...) { } #' @rdname epi_df +#' @order 1 #' @method as_epi_df epi_df #' @export as_epi_df.epi_df <- function(x, ...) { @@ -218,17 +219,18 @@ as_epi_df.epi_df <- function(x, ...) { } #' @rdname epi_df -#' @method as_epi_df tbl_df +#' @order 1 #' @importFrom rlang .data #' @importFrom tidyselect any_of #' @importFrom cli cli_inform +#' @method as_epi_df tbl_df #' @export as_epi_df.tbl_df <- function( x, geo_type = deprecated(), time_type = deprecated(), as_of, - additional_metadata = list(), + other_keys = character(), ...) { # possible standard substitutions for time_value x <- rename(x, ...) @@ -274,29 +276,28 @@ as_epi_df.tbl_df <- function( } # Use the current day-time } - assert_list(additional_metadata) - additional_metadata[["other_keys"]] <- additional_metadata[["other_keys"]] %||% character(0L) - new_epi_df(x, geo_type, time_type, as_of, additional_metadata) + assert_character(other_keys) + new_epi_df(x, geo_type, time_type, as_of, other_keys) } -#' @method as_epi_df data.frame #' @rdname epi_df +#' @order 1 +#' @method as_epi_df data.frame #' @export -as_epi_df.data.frame <- function(x, as_of, additional_metadata = list(), ...) { - as_epi_df.tbl_df(x = tibble::as_tibble(x), as_of = as_of, additional_metadata = additional_metadata, ...) +as_epi_df.data.frame <- function(x, as_of, other_keys = character(), ...) { + as_epi_df.tbl_df(x = tibble::as_tibble(x), as_of = as_of, other_keys = other_keys, ...) } -#' @method as_epi_df tbl_ts #' @rdname epi_df +#' @order 1 +#' @method as_epi_df tbl_ts #' @export -as_epi_df.tbl_ts <- function(x, as_of, additional_metadata = list(), ...) { +as_epi_df.tbl_ts <- function(x, as_of, other_keys = character(), ...) { tsibble_other_keys <- setdiff(tsibble::key_vars(x), "geo_value") - if (length(tsibble_other_keys) != 0) { - additional_metadata$other_keys <- unique( - c(additional_metadata$other_keys, tsibble_other_keys) - ) + if (length(tsibble_other_keys) > 0) { + other_keys <- unique(c(other_keys, tsibble_other_keys)) } - as_epi_df.tbl_df(x = tibble::as_tibble(x), as_of = as_of, additional_metadata = additional_metadata, ...) + as_epi_df.tbl_df(x = tibble::as_tibble(x), as_of = as_of, other_keys = other_keys, ...) } #' Test for `epi_df` format diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index 96d14d9b..dae7b243 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -65,7 +65,6 @@ epix_as_of <- function(x, max_version, min_time_value = -Inf, all_versions = FAL key(x$DT), c("geo_value", "time_value", "version") ) - if (length(other_keys) == 0) other_keys <- NULL # Check a few things on max_version if (!identical(class(max_version), class(x$DT$version))) { @@ -112,10 +111,7 @@ epix_as_of <- function(x, max_version, min_time_value = -Inf, all_versions = FAL dplyr::select(-"version") %>% as_epi_df( as_of = max_version, - additional_metadata = c( - x$additional_metadata, - list(other_keys = other_keys) - ) + other_keys = other_keys ) return(as_of_epi_df) @@ -240,9 +236,8 @@ epix_fill_through_version <- function(x, fill_versions_end, #' Default here is `TRUE`. #' @return the resulting `epi_archive` #' -#' @details In all cases, `additional_metadata` will be an empty list, and -#' `clobberable_versions_start` will be set to the earliest version that could -#' be clobbered in either input archive. +#' @details In all cases, `clobberable_versions_start` will be set to the +#' earliest version that could be clobbered in either input archive. #' #' @examples #' # Example 1 @@ -331,18 +326,6 @@ epix_merge <- function(x, y, cli_abort("`x` and `y` must share data type on their `time_value` column.") } - if (length(x$additional_metadata) != 0L) { - cli_warn("x$additional_metadata won't appear in merge result", - class = "epiprocess__epix_merge_ignores_additional_metadata" - ) - } - if (length(y$additional_metadata) != 0L) { - cli_warn("y$additional_metadata won't appear in merge result", - class = "epiprocess__epix_merge_ignores_additional_metadata" - ) - } - result_additional_metadata <- list() - result_clobberable_versions_start <- if (all(is.na(c(x$clobberable_versions_start, y$clobberable_versions_start)))) { NA # (any type of NA is fine here) @@ -508,7 +491,6 @@ epix_merge <- function(x, y, return(as_epi_archive( result_dt[], # clear data.table internal invisibility flag if set other_keys = setdiff(key(result_dt), c("geo_value", "time_value", "version")), - additional_metadata = result_additional_metadata, # It'd probably be better to pre-compactify before the merge, and might be # guaranteed not to be necessary to compactify the merge result if the # inputs are already compactified, but at time of writing we don't have diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index 1876ab46..4e74fd1c 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -63,6 +63,10 @@ print.epi_df <- function(x, ...) { ) cat(sprintf("* %-9s = %s\n", "geo_type", attributes(x)$metadata$geo_type)) cat(sprintf("* %-9s = %s\n", "time_type", attributes(x)$metadata$time_type)) + ok <- attributes(x)$metadata$other_keys + if (length(ok) > 0) { + cat(sprintf("* %-9s = %s\n", "other_keys", paste(ok, collapse = ", "))) + } cat(sprintf("* %-9s = %s\n", "as_of", attributes(x)$metadata$as_of)) # Conditional output (silent if attribute is NULL): cat(sprintf("* %-9s = %s\n", "decay_to_tibble", attr(x, "decay_to_tibble"))) @@ -86,6 +90,10 @@ print.epi_df <- function(x, ...) { summary.epi_df <- function(object, ...) { cat("An `epi_df` x, with metadata:\n") cat(sprintf("* %-9s = %s\n", "geo_type", attributes(object)$metadata$geo_type)) + ok <- attributes(object)$metadata$other_keys + if (length(ok) > 0) { + cat(sprintf("* %-9s = %s\n", "other_keys", paste(ok, collapse = ", "))) + } cat(sprintf("* %-9s = %s\n", "as_of", attributes(object)$metadata$as_of)) cat("----------\n") cat(sprintf("* %-27s = %s\n", "min time value", min(object$time_value))) @@ -206,12 +214,13 @@ dplyr_row_slice.epi_df <- function(data, i, ...) { `names<-.epi_df` <- function(x, value) { old_names <- names(x) old_metadata <- attr(x, "metadata") - old_other_keys <- old_metadata[["other_keys"]] - new_other_keys <- value[match(old_other_keys, old_names)] new_metadata <- old_metadata - new_metadata[["other_keys"]] <- new_other_keys + old_other_keys <- old_metadata[["other_keys"]] + if (!is.null(old_other_keys)) { + new_other_keys <- value[match(old_other_keys, old_names)] + new_metadata[["other_keys"]] <- new_other_keys + } result <- reclass(NextMethod(), new_metadata) - # decay to non-`epi_df` if needed: dplyr::dplyr_reconstruct(result, result) } diff --git a/R/slide.R b/R/slide.R index 91cebd2b..1bbd04b7 100644 --- a/R/slide.R +++ b/R/slide.R @@ -419,7 +419,7 @@ epi_slide <- function( #' ungroup() epi_slide_opt <- function( .x, .col_names, .f, ..., - .window_size = 0, .align = c("right", "center", "left"), + .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .all_rows = FALSE) { assert_class(.x, "epi_df") @@ -745,7 +745,7 @@ epi_slide_opt <- function( #' ungroup() epi_slide_mean <- function( .x, .col_names, ..., - .window_size = 0, .align = c("right", "center", "left"), + .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .all_rows = FALSE) { # Argument deprecation handling provided_args <- rlang::call_args_names(rlang::call_match()) @@ -828,7 +828,7 @@ epi_slide_mean <- function( #' ungroup() epi_slide_sum <- function( .x, .col_names, ..., - .window_size = 0, .align = c("right", "center", "left"), + .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .all_rows = FALSE) { # Argument deprecation handling provided_args <- rlang::call_args_names(rlang::call_match()) diff --git a/R/sysdata.rda b/R/sysdata.rda index d100711d1adc967fb453f878e1242dc3f7074e44..8e8dc5ff287ba078a5fcb07cf559bdb34b2d5d88 100644 GIT binary patch literal 709944 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�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%0ATYW9PFa!df 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 z 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

;8k6q8p!T3xK|snjX!>zkx5 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 z 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%0DKugCF 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

OJ-OwZLP};NH`(a~n>5d6%jjXl$9o7j5%)F08cZ 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 z%0A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 txQa(xEPGs@CuRwWf{dw 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 K-!ym%-C$^wt0U-6W!!0~729 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%0AHw_ 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

^aNG_(wI^I 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 z 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π#(}OuRcTE1 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 Maz!{$kfQ~yD9wd4@c;k- diff --git a/data/incidence_num_outlier_example.rda b/data/incidence_num_outlier_example.rda index e898b5eaa6b359ce9ab2bc6aa435a4a071eab54e..96288982b38ffeb94a9147c2839b31f841673435 100644 GIT binary patch literal 3221 zcmd6ic{~(c7stoaG(y?S5+>7#XkkRz*BAz2Y|~_$!3-YRcghka)Qmlpr7<%k`&N`C zStiREvSr_+WGRun^nBju&*#tg^L{_~{?0k~oOAEFTDGoNFKgOB&20=KKG*@oH1_|6 zh^>!%5pO0rL;w!Gs-dbE5gM!j)_|jbi5yugT}wf#Y5)LC&j0{`(7`^01pzxW5x=SA zL;E)zBu2jxf)j>Sg>pn`o701hk`OT0Bm~q59|Yi)B)0}>!?@&tP?IwlTxJfDgOroc z7~ziYBR$k;hqZIUFs=Q1MmZ!2yaNkFQxHr<0D{e%aTLl9!o*0(9D^VOI1&K82XAqb zIe~OlZOMXlxg3OElDPzHe+Q*X{zeri=fQx7Gm??|l(|budUsgcNB|ZMR(m4=@DApn zR{|gbO@~5_STqi<0RVa>ctQO}P$TZRjyM2|_(A6(f4+KHaZqq5|NXUeE?CH5v9OXa zh#X4}*Htyq=^r66f^!U(mJo752vr2EgQ%BNNHXOF?16GJ5S*e!sCFli5gc2vrEakW z8+p1-=~mNpgIY?ug|tI2%q&Q@g+Pz7NN-<#jr3ssd{P z=80NmN7g4il8Mn_(SKECDi%k3=+xD7NzxnUY0aMS{Kp_X3p13%oyujQ4RyW;EmtGx zP1A&$YA=X0%2l6={9v?&rUKM&sH(RV`44^_o-b9DLr;|`3hqfMH!zJ$Ew6}&vQmY?9@Wk#iK9u#a#>PCOgc5pUR$`7J7Y2Ee!p*{0rB) zGmc};dFO7FRRtwW6IWZRm@O>JoGw3-jMhhSq`KbOe1BD@O@*fOIP&8+D4y~#b*)@N zF~Y8D{4dUx#UZLdp#O}Sm6VA^Zd{{A|7e*wmLBCW90d7k@+n^$V0$b-u zrc9KT4Ybm}xd;9-a%)g>iMs+WNYiFxo)8EIeZ-H#vyLCBa@|i8Y znwpnS$=7^;4bz+8x)$Xwo5i+4lU=G^eN(y&iG3=0_42*!!P>aUSpR%w!-m9~oR2{Q zeQgm7)(fcXlm07EdBNT67JtUI0F~ZL*$wS^44bL$4PH zc;Y9o{sU!PNm3fvvCE{f@t7)U2#p=9NFgCahw11NRzwcE3F(PWY8buBeC+*G6}?L(|^; zGSktH4~VJIA@J7PG_~6gK#~bW^FCA+4x5B_IB%9rUkfAt>>t`p&Rn0HeGVa92=7WO zGK1?7M!R(g$!Ws^2AB%<)SY*f&NN)fewMz0*gHo9h!^X95s@tY$CJN5{pQcIxFRkU z%S{?F8v|DYstv>mTz77P3|P6i*hLDjOy1TiHULYxNVY}1FP^G>{EIDF=dop-WupA9 zx(jDlU}*g}*pzfyGA){*6spRXeSeKC1^KYRQuWzGU{1cY%e36t#BH;Bj2+ub?>M7R zeULL=C(4!-VlxYC3vg{T|We+o^PUL;OebDQ1=;>z* z-@GIpBIH>*CatfA&Mh2Oba#1qPIhtqyT~~IapjAex%9=Nf}9iCbO-up9vqHDOv|*% zNH~$1dqK_FPAan$>)uf6r2so_>9`;iRoU)+(#vO9=IdEssm#8hkm@$pR&ejNlQIh; zUAo{z8i@T7i5h?FRw|9m*iM^dBFjJ^%ONpUm+VhbfN$|G7;-#jYV9EfDgE4H(xNlP zjEaQ+38?=w*V3l>_@-1Z`qZY zFdwzcw3n+~Br$k-znhbp=-g+|_*K@o%4~3ZEBILIieImjd@3^XOT2*Spoe2`HZcXQ4%q z*PNn^l@op&gMMyqi}n($&FAd)2TDcI0zNIZb)>v=-c{)Im<{!>wDk}O!dx29l zlGjjV5U=mC@a(N5VwhYI(ze-fV0bt8$ez>L@%S-n&rJ= zC9sL@BAC0Ev&gSVxtUq0!c<&SL#8()P8aFx7YY2t^j^z*kSJ?|;gUT{lt#n%>g2;* zW_fLt^7IEZlejK{F6EKAAVq@qgpE!}#TDizh2iHs3a`$?1sn5KgzZ0Q0h0_3;J^0` zF$JB|X1Xh5S@ec-LaOvm%#en^zYUklu_B5pe@Iq}=LJsc;iNLLtz5IpC&@e;q*tbfhg8 zEORY(oSq+0EFeh;mteNk@jS}n+xDafX;F9KuKe*i443#b00H#o)sHPjvm!C~knJI} z8XlMN*ygu=OhICvsOxAZcL%J(=FpX{_*m5A5NsVy_R~Og2-{^=X#-A+a)vAVwY1_i zy5y&Nad}~Tpz5k__`nPHK>y=a*yt^>)H#lZDp7uPyx3 zb|$h7g$PAs3wJ2AJh{(#o^wAhp6BIrp6~gd@A;hX@A{o{y}4do#x4XMH6xsyBd)&+ zj|3!jqJI8oMeV%)9`$05`xtOxm>0$u4NIZ{=2s2p?@+%6NJ5?Lu)}@o;y@oO8vrT+ zWlK}ZXkZKtc!B$Q01!1!isNThWrl~CnmAYvjbepT&;S6?iy31!wy0rmO)7VsoTIp{ zge^E@P|ij^8!cl|(KTfb&4@6fvKo8&7UUyGeJPA7JNt}bF9Tat7pjXeX7OMu4dsbh z@$iXdH8m%W!l*U{<=GMBg5rYgZ4Co?Drv`{3|3A8MjCl|_|9-g10G@k>!^VYWZMq0 zk0{wOkX}TMb&FM&S1zOaDH_0-lsF&`j*)Y6ApW}D--P-b|AkYfwrClKZwaA~0En}q z|LRZx0XQ_M1OR?jhdaXnz*+f#8gE-sOfSal7YMA}qK;^Y!3w|y@|8>@W~xPHGF86f zyW@^@G>tINw2X?BUTG@I=VJ-3!|CXI(=vkMKOzO6dwhofG z;zD$vep~$qT7X1ZD&&Y5!=?+m%=9;;nw{5rGwvPXFmT3?_`b%pel~LP@ofo(Ml~fc z3b&ok_C2!m(NT%EXVpF@VrBjL)N8ChXhobiZ{H((Tuq^$RpG<#B0BYzPME%pztppE1Y95UVe?~gRbC~Yb%((h&KBtOy#Lj!FCLBg z>zYmb-ZO7T_HI78G=?tpE?aXBUpQ@Ya$k2fv|hO0Gcg`J%!QE`4-^xzhlnFY!qmn= z&0I@KX0>%mLk}BK7aG5P)5oA6*RHQCTl*XNr)%7qfI539TkWwlKS)%y@FDWqbD(-Q zmPIfSWl8v>(CQD(vWqt52S1K1Eu4SFL!?M@PJB83!8G`>x%jsOtw=Ri6(I?g>3aF9 zBC#9&pwy2ccbSsHXSz&Rps=aVHm}&Fl<4kLlcOO!!9fa>{_eb%9j9ok7f;YiIVv@)C##4d5yWjdA#+-M0yTe=Mxk4rJPLxH&rWS%HR7wG!Ec%= zJ7TxD3mrMt>eFPUI;JwKi4)+91mVHm;m;kOlaGTkfPIL>9wdk$2@ROYP- z7wIfLqGeC!l4~V~&CQ1v4ScGb!Fg=-Nt|jC)rWq*J(%O#^l0t|WXYu4XOSTj`~)uD zHanl_kkb<%J>(3D+mA{M`eAxprcFD;OYEIKTiC8~27AL5eVLIVMY-)FiQepE`hupo z0kKT)x^;oXfmr#}enUK+73*S25%IIpNfd*@KUtFG{9D9LdThl%bB1$mO~6v%mW48D zmHIYf6uLpN2jO!ei~e|VT&YPmMP^jTbuRMswz9gA+r;-pndRg!n|`V@i((Qn0Y+~= z2@xU2zlVyD+e-nm@kN`4yP{iC zmgZ%##vnAtkui5af}dAD)jy~8ofj9;7_HEA0)XyGp^Ghu{PO8%e~=Acw8h4SrrwP7 zJdc)^XRv^f?7UfYtU2GjRa_bJetLzLfNXnfUFgQFBG(y~*RD576erOip8EED_0KhFPDc}-yQkJ* zY1}t;EAzJMuk)nMAK+EM?G`@3_O_LYBbT~jJP~OF=JJFly+rrt}{-A`;RD% zpb;t0aF;Zdp`g##-`P(^@k%1!N!uBNL%J$9@CTAvR6o8|b}c1$KTG#5t|SjKe6?m&L#e4BYsNfZD~)s%_Xq`UQYTq4 zZCL6wIPi#GkU|z6EqPBn8hDJvfkoeyfQVbY*K#iRWibH(!2q|>IW;LO*OSSD!>0fN+urm73-pV1*t@h7|Tl96G z7g7tf)fqAoBW$Dc<|xS#H@ZM8DsD)*|R6iQa-$C!0>ksCC@o(PJTZtaoh2Kr_|lOy9B)Y?2S5 zFaHSK>wkwIgQE3O9OdZw^h%}*LAvpPUND$rAM%C`v;=Ps1d)idwcG+ z-)3lDdtH0Q9)E!HWgG48GBT8`p~+9F*q@BL|Mc^- z-6)$^gn;$d!0Lz0dP9}mKlheqZM`63ffn1_$jjF)zoqU-40Qx+eRZC-LGacrX2peP zx>vkGcXRidHGH>7_jTz@DbJo;Z$39j5mnV+&bv~daMI(B=9u*ZIBDW*139?*|! zgal=`Y!!Yun=w4eu-TH_bo~0$x-NsfPfah57QNiEd2q(+o>;Y)K*S_NQPCwsQd$3k zls5Nr2u7*fsThYB;NWH7EJ z;6x&W);U;`+HUh+CqC0aeg7tG;;19s7JLuS2*}LEKvh>h1nxuPu_gGKi?3OF&)5ny znuH`>oKtzP5gDI#K|2BO7ITe*h8tn3EUs#%>DMkHM@i9#%F<|QhYMqpLS(1l>7L5 zsC5~Lq0?+*kQJr7r0;oT)EUvM`kgFU%dFg;J_gpgqb3*u;1Lfst3Xwex6F~A>TPd# zx{PR{K1Lhwj9xxqlR#p6&`{lMVY1MxsNtRSh`X@tD7IMGtscq*E$$WparX;p!PiSW)k{zCOPpj+^>WG;c64@w+E2`0)-Gt7DX?#S zv;bYpERlaAYPujGm*gi%^uIxb5PYK7uv|p=S*}o8N_=Ubo^zy`a4a?@#F&%w?i|9@ znt<;NNk9hF9`i!2mzMp2S4BmtI3h@NZ}ogzYlV1eh%x_v3zOzw)3AR#BKmEqpM*_) zawKTY#K?ZKGsr2HJth(GyxISN;L~aBA7`Y+k#>bkOPnF9B=bJHZs^?7g@=>jyIfb9 zB}W9iee;boM)F=#HC1wDD|l9S;{C%S!Y38|B1zcZlwo1#FHkA8CY}Y(rm~|~Jxw0> zUv1OAKGHODzNL3We-mg;ev%D#?5d6A;>-=r^4<9Geua8t0&z*s6?4UXHEsRG?=mV~ z77a+8z|z$7i2=H2^Rcgpncpt$sxCHE7W69Ye44Y^m0H!7Fi9W<56-el*wO^^+UYM` b0Y9{K1Sk&auyI=J=h0v@?K2sN-;aL)=ZuL` diff --git a/data/jhu_csse_county_level_subset.rda b/data/jhu_csse_county_level_subset.rda index aca0983debba2ca6617234f82193e2a9dc63294c..bc31b4936261a7577e7462fb0d13efcd22dd8cb3 100644 GIT binary patch literal 20325 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]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 literal 81174 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

9Zq_+dd1od4~t8 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\% dplyr::rename(geo_value = state, time_value = reported_date) \%>\% as_epi_df( as_of = "2020-06-03", - additional_metadata = list(other_keys = "pol") + other_keys = "pol" ) attr(ex2, "metadata") @@ -219,9 +227,7 @@ ex3 <- ex3_input \%>\% state = rep("MA", 6), pol = rep(c("blue", "swing", "swing"), each = 2) ) \%>\% - # the 2 extra keys we added have to be specified in the other_keys - # component of additional_metadata. - as_epi_df(additional_metadata = list(other_keys = c("state", "pol"))) + as_epi_df(other_keys = c("state", "pol")) attr(ex3, "metadata") } diff --git a/man/epi_slide_mean.Rd b/man/epi_slide_mean.Rd index 820292ad..09faefb6 100644 --- a/man/epi_slide_mean.Rd +++ b/man/epi_slide_mean.Rd @@ -8,7 +8,7 @@ epi_slide_mean( .x, .col_names, ..., - .window_size = 0, + .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .all_rows = FALSE diff --git a/man/epi_slide_opt.Rd b/man/epi_slide_opt.Rd index 7fc54b7e..dcaab3f8 100644 --- a/man/epi_slide_opt.Rd +++ b/man/epi_slide_opt.Rd @@ -10,7 +10,7 @@ epi_slide_opt( .col_names, .f, ..., - .window_size = 0, + .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .all_rows = FALSE diff --git a/man/epi_slide_sum.Rd b/man/epi_slide_sum.Rd index 3c7baedc..0c83c432 100644 --- a/man/epi_slide_sum.Rd +++ b/man/epi_slide_sum.Rd @@ -8,7 +8,7 @@ epi_slide_sum( .x, .col_names, ..., - .window_size = 0, + .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .all_rows = FALSE diff --git a/man/epix_merge.Rd b/man/epix_merge.Rd index 43f53c33..564a1fdc 100644 --- a/man/epix_merge.Rd +++ b/man/epix_merge.Rd @@ -46,9 +46,8 @@ clobberable versions). If the \code{versions_end} values differ, the \code{sync} parameter controls what is done. } \details{ -In all cases, \code{additional_metadata} will be an empty list, and -\code{clobberable_versions_start} will be set to the earliest version that could -be clobbered in either input archive. +In all cases, \code{clobberable_versions_start} will be set to the +earliest version that could be clobbered in either input archive. } \examples{ # Example 1 diff --git a/tests/testthat/test-archive.R b/tests/testthat/test-archive.R index 7f20ddeb..1791d870 100644 --- a/tests/testthat/test-archive.R +++ b/tests/testthat/test-archive.R @@ -77,14 +77,6 @@ test_that("other_keys cannot contain names geo_value, time_value or version", { ) }) -test_that("Warning thrown when other_metadata contains overlapping names with geo_type field", { - expect_warning(as_epi_archive(archive_data, additional_metadata = list(geo_type = 1), compactify = FALSE), - regexp = "`additional_metadata` names overlap with existing metadata fields" - ) - expect_warning(as_epi_archive(archive_data, additional_metadata = list(time_type = 1), compactify = FALSE), - regexp = "`additional_metadata` names overlap with existing metadata fields" - ) -}) test_that("epi_archives are correctly instantiated with a variety of data types", { d <- as.Date("2020-01-01") @@ -98,22 +90,22 @@ test_that("epi_archives are correctly instantiated with a variety of data types" ea1 <- as_epi_archive(df, compactify = FALSE) expect_equal(key(ea1$DT), c("geo_value", "time_value", "version")) - expect_equal(ea1$additional_metadata, list()) + expect_null(ea1$additional_metadata) - ea2 <- as_epi_archive(df, other_keys = "value", additional_metadata = list(value = df$value), compactify = FALSE) + ea2 <- as_epi_archive(df, other_keys = "value", compactify = FALSE) expect_equal(key(ea2$DT), c("geo_value", "time_value", "value", "version")) - expect_equal(ea2$additional_metadata, list(value = df$value)) + expect_null(ea2$additional_metadata) # Tibble tib <- tibble::tibble(df, code = "x") ea3 <- as_epi_archive(tib, compactify = FALSE) expect_equal(key(ea3$DT), c("geo_value", "time_value", "version")) - expect_equal(ea3$additional_metadata, list()) + expect_null(ea3$additional_metadata) - ea4 <- as_epi_archive(tib, other_keys = "code", additional_metadata = list(value = df$value), compactify = FALSE) + ea4 <- as_epi_archive(tib, other_keys = "code", compactify = FALSE) expect_equal(key(ea4$DT), c("geo_value", "time_value", "code", "version")) - expect_equal(ea4$additional_metadata, list(value = df$value)) + expect_null(ea4$additional_metadata) # Keyed data.table kdt <- data.table::data.table( @@ -128,12 +120,12 @@ test_that("epi_archives are correctly instantiated with a variety of data types" ea5 <- as_epi_archive(kdt, compactify = FALSE) # Key from data.table isn't absorbed when as_epi_archive is used expect_equal(key(ea5$DT), c("geo_value", "time_value", "version")) - expect_equal(ea5$additional_metadata, list()) + expect_null(ea5$additional_metadata) - ea6 <- as_epi_archive(kdt, other_keys = "value", additional_metadata = list(value = df$value), compactify = FALSE) + ea6 <- as_epi_archive(kdt, other_keys = "value", compactify = FALSE) # Mismatched keys, but the one from as_epi_archive overrides expect_equal(key(ea6$DT), c("geo_value", "time_value", "value", "version")) - expect_equal(ea6$additional_metadata, list(value = df$value)) + expect_null(ea6$additional_metadata) # Unkeyed data.table udt <- data.table::data.table( @@ -146,11 +138,11 @@ test_that("epi_archives are correctly instantiated with a variety of data types" ea7 <- as_epi_archive(udt, compactify = FALSE) expect_equal(key(ea7$DT), c("geo_value", "time_value", "version")) - expect_equal(ea7$additional_metadata, list()) + expect_null(ea7$additional_metadata) - ea8 <- as_epi_archive(udt, other_keys = "code", additional_metadata = list(value = df$value), compactify = FALSE) + ea8 <- as_epi_archive(udt, other_keys = "code", compactify = FALSE) expect_equal(key(ea8$DT), c("geo_value", "time_value", "code", "version")) - expect_equal(ea8$additional_metadata, list(value = df$value)) + expect_null(ea8$additional_metadata) # epi_df edf1 <- jhu_csse_daily_subset %>% @@ -159,11 +151,11 @@ test_that("epi_archives are correctly instantiated with a variety of data types" ea9 <- as_epi_archive(edf1, compactify = FALSE) expect_equal(key(ea9$DT), c("geo_value", "time_value", "version")) - expect_equal(ea9$additional_metadata, list()) + expect_null(ea9$additional_metadata) - ea10 <- as_epi_archive(edf1, other_keys = "code", additional_metadata = list(value = df$value), compactify = FALSE) + ea10 <- as_epi_archive(edf1, other_keys = "code", compactify = FALSE) expect_equal(key(ea10$DT), c("geo_value", "time_value", "code", "version")) - expect_equal(ea10$additional_metadata, list(value = df$value)) + expect_null(ea10$additional_metadata) # Keyed epi_df edf2 <- data.frame( @@ -176,15 +168,15 @@ test_that("epi_archives are correctly instantiated with a variety of data types" cases = 1:20, misc = "USA" ) %>% - as_epi_df(additional_metadata = list(other_keys = "misc")) + as_epi_df(other_keys = "misc") ea11 <- as_epi_archive(edf2, compactify = FALSE) expect_equal(key(ea11$DT), c("geo_value", "time_value", "version")) - expect_equal(ea11$additional_metadata, list()) + expect_null(ea11$additional_metadata) - ea12 <- as_epi_archive(edf2, other_keys = "misc", additional_metadata = list(value = df$misc), compactify = FALSE) + ea12 <- as_epi_archive(edf2, other_keys = "misc", compactify = FALSE) expect_equal(key(ea12$DT), c("geo_value", "time_value", "misc", "version")) - expect_equal(ea12$additional_metadata, list(value = df$misc)) + expect_null(ea12$additional_metadata) }) test_that("`epi_archive` rejects nonunique keys", { diff --git a/tests/testthat/test-arrange-canonical.R b/tests/testthat/test-arrange-canonical.R index ec42feac..939d2f32 100644 --- a/tests/testthat/test-arrange-canonical.R +++ b/tests/testthat/test-arrange-canonical.R @@ -7,10 +7,12 @@ test_that("canonical arrangement works", { ) expect_error(arrange_canonical(tib)) - tib <- tib %>% as_epi_df(additional_metadata = list(other_keys = "demo_grp")) - expect_equal(names(tib), c("geo_value", "time_value", "x", "demo_grp")) + tib <- tib %>% as_epi_df(other_keys = "demo_grp") + expect_equal(names(tib), c("geo_value", "time_value", "demo_grp", "x")) - tib_sorted <- arrange_canonical(tib) + tib_cols_shuffled <- tib %>% select(geo_value, time_value, x, demo_grp) + + tib_sorted <- arrange_canonical(tib_cols_shuffled) expect_equal(names(tib_sorted), c("geo_value", "time_value", "demo_grp", "x")) expect_equal(tib_sorted$geo_value, rep(c("ca", "ga"), each = 4)) expect_equal(tib_sorted$time_value, c(1, 1, 2, 2, 1, 1, 2, 2)) diff --git a/tests/testthat/test-epi_df.R b/tests/testthat/test-epi_df.R index a49855aa..2444a87a 100644 --- a/tests/testthat/test-epi_df.R +++ b/tests/testthat/test-epi_df.R @@ -23,8 +23,7 @@ test_that("new_epi_df works as intended", { expect_true(lubridate::is.POSIXt(attributes(epi_tib)$metadata$as_of)) }) -test_that("as_epi_df errors when additional_metadata is not a list", { - # This is the 3rd example from as_epi_df +test_that("as_epi_df errors for non-character other_keys", { ex_input <- jhu_csse_county_level_subset %>% dplyr::filter(time_value > "2021-12-01", state_name == "Massachusetts") %>% dplyr::slice_tail(n = 6) %>% @@ -35,9 +34,10 @@ test_that("as_epi_df errors when additional_metadata is not a list", { ) expect_error( - as_epi_df(ex_input, additional_metadata = c(other_keys = "state", "pol")), - "Must be of type 'list', not 'character'." + as_epi_df(ex_input, other_keys = list()), + "Must be of type 'character'" ) + expect_silent(as_epi_df(ex_input, other_keys = c("state", "pol"))) }) test_that("as_epi_df works for nonstandard input", { @@ -81,7 +81,7 @@ tib <- tibble::tibble( time_value = rep(seq(as.Date("2020-01-01"), by = 1, length.out = 5), times = 2), geo_value = rep(c("ca", "hi"), each = 5) ) -epi_tib <- epiprocess::as_epi_df(tib) +epi_tib <- as_epi_df(tib) test_that("grouped epi_df maintains type for select", { grouped_epi <- epi_tib %>% group_by(geo_value) selected_df <- grouped_epi %>% select(-y) @@ -108,9 +108,7 @@ test_that("grouped epi_df handles extra keys correctly", { geo_value = rep(c("ca", "hi"), each = 5), extra_key = rep(seq(as.Date("2020-01-01"), by = 1, length.out = 5), times = 2) ) - epi_tib <- epiprocess::as_epi_df(tib, - additional_metadata = list(other_keys = "extra_key") - ) + epi_tib <- as_epi_df(tib, other_keys = "extra_key") grouped_epi <- epi_tib %>% group_by(geo_value) selected_df <- grouped_epi %>% select(-extra_key) expect_true(inherits(selected_df, "epi_df")) diff --git a/tests/testthat/test-epix_merge.R b/tests/testthat/test-epix_merge.R index c285ad39..5b3de284 100644 --- a/tests/testthat/test-epix_merge.R +++ b/tests/testthat/test-epix_merge.R @@ -177,26 +177,6 @@ test_that("epix_merge forbids and warns on metadata and naming issues", { ), regexp = "overlapping.*names" ) - expect_warning( - epix_merge( - as_epi_archive(tibble::tibble(geo_value = "ak", time_value = test_date, version = test_date + 1L, x_value = 1L), - additional_metadata = list("updates_fetched" = lubridate::ymd_hms("2022-05-01 16:00:00", tz = "UTC")) - ), - as_epi_archive(tibble::tibble(geo_value = "ak", time_value = test_date, version = test_date + 1L, y_value = 2L)) - ), - regexp = "x\\$additional_metadata", - class = "epiprocess__epix_merge_ignores_additional_metadata" - ) - expect_warning( - epix_merge( - as_epi_archive(tibble::tibble(geo_value = "ak", time_value = test_date, version = test_date + 1L, x_value = 1L)), - as_epi_archive(tibble::tibble(geo_value = "ak", time_value = test_date, version = test_date + 1L, y_value = 2L), - additional_metadata = list("updates_fetched" = lubridate::ymd_hms("2022-05-01 16:00:00", tz = "UTC")) - ) - ), - regexp = "y\\$additional_metadata", - class = "epiprocess__epix_merge_ignores_additional_metadata" - ) }) # use `local` to prevent accidentally using the x, y, xy bindings here diff --git a/tests/testthat/test-grouped_epi_archive.R b/tests/testthat/test-grouped_epi_archive.R index 4d1c1468..6ae009ca 100644 --- a/tests/testthat/test-grouped_epi_archive.R +++ b/tests/testthat/test-grouped_epi_archive.R @@ -80,7 +80,7 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { time_value = as.Date(time_value) ) %>% # as_epi_df(as_of = as.Date("2000-01-03"), - # additional_metadata = list(other_keys = "age_group")) %>% + # other_keys = "age_group") %>% # # put back in expected order; see issue #166: # select(geo_value, age_group, time_value, s) %>% group_by(geo_value, age_group, .drop = FALSE) diff --git a/tests/testthat/test-methods-epi_df.R b/tests/testthat/test-methods-epi_df.R index e28e23de..bef7f680 100644 --- a/tests/testthat/test-methods-epi_df.R +++ b/tests/testthat/test-methods-epi_df.R @@ -10,8 +10,7 @@ toy_epi_df <- tibble::tibble( indic_var1 = as.factor(rep(1:2, times = 5)), indic_var2 = as.factor(rep(letters[1:5], times = 2)) ) %>% as_epi_df( - additional_metadata = - list(other_keys = c("indic_var1", "indic_var2")) + other_keys = c("indic_var1", "indic_var2") ) att_toy <- attr(toy_epi_df, "metadata") @@ -79,12 +78,12 @@ test_that("Subsetting drops & does not drop the epi_df class appropriately", { expect_identical(att_row_col_subset2$geo_type, att_toy$geo_type) expect_identical(att_row_col_subset2$time_type, att_toy$time_type) expect_identical(att_row_col_subset2$as_of, att_toy$as_of) - expect_identical(att_row_col_subset2$other_keys, character(0)) + expect_identical(att_row_col_subset2$other_keys, att_toy$other_keys[1]) }) test_that("When duplicate cols in subset should abort", { expect_error(toy_epi_df[, c(2, 2:3, 4, 4, 4)], - "Duplicated column names: time_value, y", + "Duplicated column names: time_value, indic_var2", fixed = TRUE ) expect_error(toy_epi_df[1:4, c(1, 2:4, 1)], @@ -95,7 +94,7 @@ test_that("When duplicate cols in subset should abort", { test_that("Correct metadata when subset includes some of other_keys", { # Only include other_var of indic_var1 - only_indic_var1 <- toy_epi_df[, 1:5] + only_indic_var1 <- toy_epi_df[, c(1:3, 5:6)] att_only_indic_var1 <- attr(only_indic_var1, "metadata") expect_true(is_epi_df(only_indic_var1)) @@ -107,7 +106,7 @@ test_that("Correct metadata when subset includes some of other_keys", { expect_identical(att_only_indic_var1$other_keys, att_toy$other_keys[-2]) # Only include other_var of indic_var2 - only_indic_var2 <- toy_epi_df[, c(1:4, 6)] + only_indic_var2 <- toy_epi_df[, c(1:2, 4:6)] att_only_indic_var2 <- attr(only_indic_var2, "metadata") expect_true(is_epi_df(only_indic_var2)) @@ -142,7 +141,7 @@ test_that("Grouping are dropped by `as_tibble`", { test_that("Renaming columns gives appropriate colnames and metadata", { edf <- tibble::tibble(geo_value = "ak", time_value = as.Date("2020-01-01"), age = 1, value = 1) %>% - as_epi_df(additional_metadata = list(other_keys = "age")) + as_epi_df(other_keys = "age") # renaming using base R renamed_edf1 <- edf %>% `[`(c("geo_value", "time_value", "age", "value")) %>% @@ -151,14 +150,14 @@ test_that("Renaming columns gives appropriate colnames and metadata", { expect_identical(attr(renamed_edf1, "metadata")$other_keys, c("age_group")) # renaming using select renamed_edf2 <- edf %>% - as_epi_df(additional_metadata = list(other_keys = "age")) %>% + as_epi_df(other_keys = "age") %>% select(geo_value, time_value, age_group = age, value) expect_identical(renamed_edf1, renamed_edf2) }) test_that("Renaming columns while grouped gives appropriate colnames and metadata", { gedf <- tibble::tibble(geo_value = "ak", time_value = as.Date("2020-01-01"), age = 1, value = 1) %>% - as_epi_df(additional_metadata = list(other_keys = "age")) %>% + as_epi_df(other_keys = "age") %>% group_by(geo_value) # renaming using base R renamed_gedf1 <- gedf %>% @@ -178,7 +177,7 @@ test_that("Renaming columns while grouped gives appropriate colnames and metadat test_that("Additional `select` on `epi_df` tests", { edf <- tibble::tibble(geo_value = "ak", time_value = as.Date("2020-01-01"), age = 1, value = 1) %>% - as_epi_df(additional_metadata = list(other_keys = "age")) + as_epi_df(other_keys = "age") # Dropping a non-geo_value epikey column doesn't decay, though maybe it # should, since you'd expect that to possibly result in multiple rows per diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index 12e7a3f7..d18f9f48 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -251,8 +251,8 @@ test_that("guess_period works", { weekly_posixcts ) # On POSIXlts: - daily_posixlts <- as.POSIXlt(daily_dates, tz = "US/Aleutian") + 3600 - weekly_posixlts <- as.POSIXlt(weekly_dates, tz = "US/Aleutian") + 3600 + daily_posixlts <- as.POSIXlt(daily_dates, tz = "UTC") + 3600 + weekly_posixlts <- as.POSIXlt(weekly_dates, tz = "UTC") + 3600 expect_identical( daily_posixlts[[1L]] + guess_period(daily_posixlts) * (seq_along(daily_posixlts) - 1L), daily_posixlts diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 3d616d92..c5cc154b 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -119,7 +119,6 @@ The following pieces of metadata are included as fields in an `epi_archive` object: * `geo_type`: the type for the geo values. -* `additional_metadata`: list of additional metadata for the data archive. Metadata for an `epi_archive` object `x` can be accessed (and altered) directly, as in `x$geo_type`, etc. Just like `as_epi_df()`, the function diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index 24a98505..e6c78aba 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -234,7 +234,7 @@ ex2 <- ex2 %>% rename(geo_value = state, time_value = reported_date) %>% as_epi_df( as_of = "2020-06-03", - additional_metadata = list(other_keys = "pol") + other_keys = "pol" ) attr(ex2, "metadata") @@ -264,12 +264,12 @@ ex3 <- ex3 %>% state = rep(tolower("MA"), 6), pol = rep(c("blue", "swing", "swing"), each = 2) ) %>% - as_epi_df(additional_metadata = list(other_keys = c("state", "pol")), as_of = as.Date("2024-03-20")) + as_epi_df(other_keys = c("state", "pol"), as_of = as.Date("2024-03-20")) attr(ex3, "metadata") ``` -Note that the two additional keys we added, `state` and `pol`, are specified as a character vector in the `other_keys` component of the `additional_metadata` list. They must be specified in this manner so that downstream actions on the `epi_df`, like model fitting and prediction, can recognize and use these keys. +Note that the two additional keys we added, `state` and `pol`, are specified as a character vector in the `other_keys` argument. They must be specified in this manner so that downstream actions on the `epi_df`, like model fitting and prediction, can recognize and use these keys. Currently `other_keys` metadata in `epi_df` doesn't impact `epi_slide()`, contrary to `other_keys` in `as_epi_archive` which affects how the update data is interpreted. From f479acfe03cb67ccafee51e595ec5634479e208f Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 23 Aug 2024 11:20:14 -0700 Subject: [PATCH 053/110] docs: version and news --- DESCRIPTION | 4 ++-- NEWS.md | 44 +++++++++++++++++++++++++++++--------------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e77f331a..e14bc7c6 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: epiprocess Title: Tools for basic signal processing in epidemiology -Version: 0.8.5 +Version: 0.9.0 Authors@R: c( person("Jacob", "Bien", role = "ctb"), person("Logan", "Brooks", , "lcbrooks@andrew.cmu.edu", role = c("aut", "cre")), @@ -73,7 +73,7 @@ Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 -Collate: +Collate: 'archive.R' 'autoplot.R' 'correlation.R' diff --git a/NEWS.md b/NEWS.md index 8bdb8c47..5bd2244b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,21 +6,35 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat ## Breaking changes -- In `epi[x]_slide` - - `names_sep` is deprecated, and if you return data frames from your - computations, they will no longer be unpacked into separate columns with - name prefixes; instead: - - if you don't provide a name for your slide computations, they will be - unpacked into separate columns, just without any name prefixes - - if you do provide a name for your slide computation, it will become a - packed data.frame-class column (see `tidyr::pack`). - - `as_list_col` is deprecated; you can now directly return a list from your - slide computations instead. -- `additional_metadata` is no longer accepted in `as_epi_df()` or - `as_epi_archive()`. Use the new `other_keys` arg to specify additional key - columns, such as age group columns or other demographic breakdowns. - Miscellaneous metadata are no longer handled by `epiprocess`, but you can use - R's built-in `attr<-` instead for a similar feature. +- `epi_slide` interface has major breaking changes. + - All variables are now dot-prefixed to be more consistent with tidyverse + style for functions that allow tidyeval. + - The `before/after` arguments have been replaced with the `.window_size` and + `.align` arguments. See documentation for how to translate. + - `names_sep` has been removed. If you return data frames from your + computations: + - without a name, they will be unpacked into separate columns without name + prefixes + - with a name, it will become a packed data.frame-class column (see + `tidyr::pack`). + - `as_list_col` has been removed. You can now directly return a list from your + slide computations instead. If you were using `as_list_col=TRUE`, you will + need to wrap your output in a list. +- `epix_slide` interface has major changes. + - `names_sep` has been removed. If you return data frames from your + computations: + - without a name, they will be unpacked into separate columns without name + prefixes + - with a name, it will become a packed data.frame-class column (see + `tidyr::pack`). + - `as_list_col` has been removed. You can now directly return a list from your + slide computations instead. If you were using `as_list_col=TRUE`, you will + need to wrap your output in a list. +- `as_epi_df()` or `as_epi_archive()` no longer accept `additional_metadata`. + Use the new `other_keys` arg to specify additional key columns, such as age + group columns or other demographic breakdowns. Miscellaneous metadata are no + longer handled by `epiprocess`, but you can use R's built-in `attr<-` instead + for a similar feature. ## Improvements From 2382af03e2ad132b8b6ef52d09620adb900f9b32 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 23 Aug 2024 11:20:43 -0700 Subject: [PATCH 054/110] refactor!: hard deprecate names_sep and as_list_col in epix_slide --- R/grouped_epi_archive.R | 40 +++++++++++++++++----------------------- R/methods-epi_archive.R | 22 ++++------------------ R/slide.R | 20 ++++---------------- 3 files changed, 25 insertions(+), 57 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index f6ae0419..deeeaf65 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -211,14 +211,10 @@ epix_slide.grouped_epi_archive <- function( before = Inf, ref_time_values = NULL, new_col_name = NULL, - all_versions = FALSE, - as_list_col = deprecated(), - names_sep = deprecated()) { - # Perform some deprecated argument checks without using ` = - # deprecated()` in the function signature, because they are from - # early development versions and much more likely to be clutter than - # informative in the signature. - if ("group_by" %in% nse_dots_names(...)) { + all_versions = FALSE) { + # Deprecated argument handling + provided_args <- rlang::call_args_names(rlang::call_match()) + if ("group_by" %in% provided_args) { cli_abort(" The `group_by` argument to `slide` has been removed; please use the `group_by()` S3 generic function @@ -229,13 +225,25 @@ epix_slide.grouped_epi_archive <- function( the slide.) ", class = "epiprocess__epix_slide_group_by_parameter_deprecated") } - if ("all_rows" %in% nse_dots_names(...)) { + if ("all_rows" %in% provided_args) { cli_abort(" The `all_rows` argument has been removed from `epix_slide` (but is still supported in `epi_slide`). Add rows for excluded results with a manual join instead. ", class = "epiprocess__epix_slide_all_rows_parameter_deprecated") } + if ("as_list_col" %in% provided_args) { + cli::cli_abort( + "epix_slide: the argument `as_list_col` is deprecated. If FALSE, you can just remove it. + If TRUE, have your given computation wrap its result using `list(result)` instead." + ) + } + if ("names_sep" %in% provided_args) { + cli::cli_abort( + "epix_slide: the argument `names_sep` is deprecated. If NULL, you can remove it, it is now default. + If a string, please manually prefix your column names instead." + ) + } if (is.null(ref_time_values)) { ref_time_values <- epix_slide_ref_time_values_default(x$private$ungrouped) @@ -280,20 +288,6 @@ epix_slide.grouped_epi_archive <- function( f <- as_slide_computation(f, ...) } - if (lifecycle::is_present(as_list_col)) { - lifecycle::deprecate_warn("0.8.1", "epix_slide(as_list_col =)", details = "Have your computation wrap its result using `list(result)` instead, unless you want more than one list element per computation. Automatically trying this sort of rewrite...") # nolint: line_length_linter - f_orig <- f - f <- function(...) list(f_orig(...)) - } - - if (lifecycle::is_present(names_sep)) { - if (is.null(names_sep)) { - lifecycle::deprecate_warn("0.8.1", "epix_slide(names_sep =)", details = "You can simply remove `names_sep = NULL`; that's now the defualt.") # nolint: line_length_linter - } else { - lifecycle::deprecate_stop("0.8.1", "epix_slide(names_sep =)", details = "Manually prefix your column names instead, or wrap the results in (return `list(result)` instead of `result` in your slide computation) and pipe into tidyr::unnest(names_sep = )") # nolint: line_length_linter - } - } - # Computation for one group, one time value comp_one_grp <- function(.data_group, .group_key, f, ..., diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index dae7b243..a666e5f3 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -659,15 +659,6 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' `ref_time_value - before` and `ref_time_value`. Otherwise, `f` will be #' passed only the most recent `version` for every unique `time_value`. #' Default is `FALSE`. -#' @param as_list_col `r lifecycle::badge("deprecated")` if you want a list -#' column as output, you can now just directly output a list from your slide -#' computations. Usually this just means wrapping your output in a length-1 -#' list (outputting `list(result)` instead of `result`). -#' @param names_sep `r lifecycle::badge("deprecated")` if you were specifying -#' `names_sep = NULL`, that's no longer needed. If you were using a non-NULL -#' value, you can either directly prefix your slide computation names, or -#' output a list and then later call `tidyr::unnest(slide_output, -#' , names_sep = )`. #' @return A tibble whose columns are: the grouping variables, `time_value`, #' containing the reference time values for the slide computation, and a #' column named according to the `new_col_name` argument, containing the slide @@ -777,7 +768,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' ) #' }, #' before = 5, all_versions = FALSE, -#' ref_time_values = ref_time_values, names_sep = NULL +#' ref_time_values = ref_time_values #' ) %>% #' ungroup() %>% #' arrange(geo_value, time_value) @@ -812,7 +803,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' ) #' }, #' before = 5, all_versions = TRUE, -#' ref_time_values = ref_time_values, names_sep = NULL +#' ref_time_values = ref_time_values #' ) %>% #' ungroup() %>% #' # Focus on one geo_value so we can better see the columns above: @@ -827,9 +818,7 @@ epix_slide <- function( before = Inf, ref_time_values = NULL, new_col_name = NULL, - all_versions = FALSE, - as_list_col = deprecated(), - names_sep = deprecated()) { + all_versions = FALSE) { UseMethod("epix_slide") } @@ -843,9 +832,7 @@ epix_slide.epi_archive <- function( before = Inf, ref_time_values = NULL, new_col_name = NULL, - all_versions = FALSE, - as_list_col = deprecated(), - names_sep = deprecated()) { + all_versions = FALSE) { # For an "ungrouped" slide, treat all rows as belonging to one big # group (group by 0 vars), like `dplyr::summarize`, and let the # resulting `grouped_epi_archive` handle the slide: @@ -854,7 +841,6 @@ epix_slide.epi_archive <- function( f, ..., before = before, ref_time_values = ref_time_values, new_col_name = new_col_name, - as_list_col = as_list_col, names_sep = names_sep, all_versions = all_versions ) %>% # We want a slide on ungrouped archives to output something diff --git a/R/slide.R b/R/slide.R index 1bbd04b7..d488d681 100644 --- a/R/slide.R +++ b/R/slide.R @@ -83,7 +83,7 @@ epi_slide <- function( .x, .f, ..., .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .new_col_name = NULL, .all_rows = FALSE) { - # Argument deprecation handling + # Deprecated argument handling provided_args <- rlang::call_args_names(rlang::call_match()) if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "f", "ref_time_values", "new_col_name", "all_rows")))) { cli::cli_abort( @@ -423,7 +423,7 @@ epi_slide_opt <- function( .ref_time_values = NULL, .all_rows = FALSE) { assert_class(.x, "epi_df") - # Argument deprecation handling + # Deprecated argument handling provided_args <- rlang::call_args_names(rlang::call_match()) if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "col_names", "f", "ref_time_values", "all_rows")))) { cli::cli_abort( @@ -747,7 +747,7 @@ epi_slide_mean <- function( .x, .col_names, ..., .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .all_rows = FALSE) { - # Argument deprecation handling + # Deprecated argument handling provided_args <- rlang::call_args_names(rlang::call_match()) if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "col_names", "f", "ref_time_values", "all_rows")))) { cli::cli_abort( @@ -762,12 +762,6 @@ epi_slide_mean <- function( If TRUE, have your given computation wrap its result using `list(result)` instead." ) } - if ("names_sep" %in% provided_args) { - cli::cli_abort( - "epi_slide_mean: the argument `names_sep` is deprecated. If NULL, you can remove it, it is now default. - If a string, please manually prefix your column names instead." - ) - } if ("before" %in% provided_args || "after" %in% provided_args) { cli::cli_abort( "epi_slide_mean: `before` and `after` are deprecated for `epi_slide`. Use `.window_size` and `.align` instead. @@ -830,7 +824,7 @@ epi_slide_sum <- function( .x, .col_names, ..., .window_size = 1, .align = c("right", "center", "left"), .ref_time_values = NULL, .all_rows = FALSE) { - # Argument deprecation handling + # Deprecated argument handling provided_args <- rlang::call_args_names(rlang::call_match()) if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "col_names", "f", "ref_time_values", "all_rows")))) { cli::cli_abort( @@ -845,12 +839,6 @@ epi_slide_sum <- function( If TRUE, have your given computation wrap its result using `list(result)` instead." ) } - if ("names_sep" %in% provided_args) { - cli::cli_abort( - "epi_slide_sum: the argument `names_sep` is deprecated. If NULL, you can remove it, it is now default. - If a string, please manually prefix your column names instead." - ) - } if ("before" %in% provided_args || "after" %in% provided_args) { cli::cli_abort( "epi_slide_sum: `before` and `after` are deprecated for `epi_slide`. Use `.window_size` and `.align` instead. From 5f9ffc8293a597aae0efe2b1f36f73a6ffe63913 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 23 Aug 2024 11:20:57 -0700 Subject: [PATCH 055/110] doc: doc --- man/epix_slide.Rd | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index 5dc8f22c..8c56982d 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -13,9 +13,7 @@ epix_slide( before = Inf, ref_time_values = NULL, new_col_name = NULL, - all_versions = FALSE, - as_list_col = deprecated(), - names_sep = deprecated() + all_versions = FALSE ) \method{epix_slide}{epi_archive}( @@ -25,9 +23,7 @@ epix_slide( before = Inf, ref_time_values = NULL, new_col_name = NULL, - all_versions = FALSE, - as_list_col = deprecated(), - names_sep = deprecated() + all_versions = FALSE ) \method{epix_slide}{grouped_epi_archive}( @@ -37,9 +33,7 @@ epix_slide( before = Inf, ref_time_values = NULL, new_col_name = NULL, - all_versions = FALSE, - as_list_col = deprecated(), - names_sep = deprecated() + all_versions = FALSE ) } \arguments{ @@ -107,16 +101,6 @@ into the constituent columns and those names used. Note that setting \code{ref_time_value - before} and \code{ref_time_value}. Otherwise, \code{f} will be passed only the most recent \code{version} for every unique \code{time_value}. Default is \code{FALSE}.} - -\item{as_list_col}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you want a list -column as output, you can now just directly output a list from your slide -computations. Usually this just means wrapping your output in a length-1 -list (outputting \code{list(result)} instead of \code{result}).} - -\item{names_sep}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} if you were specifying -\code{names_sep = NULL}, that's no longer needed. If you were using a non-NULL -value, you can either directly prefix your slide computation names, or -output a list and then later call \verb{tidyr::unnest(slide_output, , names_sep = )}.} } \value{ A tibble whose columns are: the grouping variables, \code{time_value}, @@ -239,7 +223,7 @@ archive_cases_dv_subset \%>\% ) }, before = 5, all_versions = FALSE, - ref_time_values = ref_time_values, names_sep = NULL + ref_time_values = ref_time_values ) \%>\% ungroup() \%>\% arrange(geo_value, time_value) @@ -274,7 +258,7 @@ archive_cases_dv_subset \%>\% ) }, before = 5, all_versions = TRUE, - ref_time_values = ref_time_values, names_sep = NULL + ref_time_values = ref_time_values ) \%>\% ungroup() \%>\% # Focus on one geo_value so we can better see the columns above: From 2c043d565db70e87ed50e656ab95680c3640ef7b Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 23 Aug 2024 16:49:50 -0700 Subject: [PATCH 056/110] refactor: dot prefix epix_slide args as well --- R/archive.R | 10 +- R/grouped_epi_archive.R | 65 ++--- R/methods-epi_archive.R | 130 +++++----- R/slide.R | 4 +- man/epix_slide.Rd | 129 +++++----- man/group_by.epi_archive.Rd | 10 +- tests/testthat/test-deprecations.R | 16 +- tests/testthat/test-epix_slide.R | 284 +++++++++++----------- tests/testthat/test-grouped_epi_archive.R | 4 +- vignettes/advanced.Rmd | 6 +- vignettes/archive.Rmd | 8 +- vignettes/compactify.Rmd | 2 +- vignettes/slide.Rmd | 2 +- 13 files changed, 325 insertions(+), 345 deletions(-) diff --git a/R/archive.R b/R/archive.R index fbcc3c36..f7b11aff 100644 --- a/R/archive.R +++ b/R/archive.R @@ -624,10 +624,10 @@ print.epi_archive <- function(x, ..., class = TRUE, methods = TRUE) { #' archive_cases_dv_subset %>% #' group_by(geo_value) %>% #' epix_slide( -#' f = ~ mean(.x$case_rate_7d_av), -#' before = 2, -#' ref_time_values = as.Date("2020-06-11") + 0:2, -#' new_col_name = "case_rate_3d_av" +#' .f = ~ mean(.x$case_rate_7d_av), +#' .before = 2, +#' .ref_time_values = as.Date("2020-06-11") + 0:2, +#' .new_col_name = "case_rate_3d_av" #' ) %>% #' ungroup() #' @@ -672,7 +672,7 @@ print.epi_archive <- function(x, ..., class = TRUE, methods = TRUE) { #' #' toy_archive %>% #' group_by(geo_value, age_group, .drop = FALSE) %>% -#' epix_slide(f = ~ sum(.x$value), before = 20) %>% +#' epix_slide(.f = ~ sum(.x$value), .before = 20) %>% #' ungroup() #' #' @importFrom dplyr group_by diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index deeeaf65..9e9279fc 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -205,15 +205,24 @@ ungroup.grouped_epi_archive <- function(x, ...) { #' env missing_arg #' @export epix_slide.grouped_epi_archive <- function( - x, - f, + .x, + .f, ..., - before = Inf, - ref_time_values = NULL, - new_col_name = NULL, - all_versions = FALSE) { + .before = Inf, + .ref_time_values = NULL, + .new_col_name = NULL, + .all_versions = FALSE) { # Deprecated argument handling provided_args <- rlang::call_args_names(rlang::call_match()) + if (any(purrr::map_lgl( + provided_args, ~ .x %in% c("x", "f", "before", "ref_time_values", "new_col_name", "all_versions") + ))) { + cli::cli_abort( + "epix_slide: you are using one of the following old argument names: `x`, `f`, `before`, `ref_time_values`, + `new_col_name`, `all_versions`. Please use the new names: `.x`, `.f`, `.before`, `.ref_time_values`, + `.new_col_name`, `.all_versions`." + ) + } if ("group_by" %in% provided_args) { cli_abort(" The `group_by` argument to `slide` has been removed; please use @@ -245,33 +254,33 @@ epix_slide.grouped_epi_archive <- function( ) } - if (is.null(ref_time_values)) { - ref_time_values <- epix_slide_ref_time_values_default(x$private$ungrouped) + # Argument validation + if (is.null(.ref_time_values)) { + ref_time_values <- epix_slide_ref_time_values_default(.x$private$ungrouped) } else { - assert_numeric(ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) - if (any(ref_time_values > x$private$ungrouped$versions_end)) { + assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) + if (any(.ref_time_values > .x$private$ungrouped$versions_end)) { cli_abort("Some `ref_time_values` are greater than the latest version in the archive.") } - if (anyDuplicated(ref_time_values) != 0L) { + if (anyDuplicated(.ref_time_values) != 0L) { cli_abort("Some `ref_time_values` are duplicated.") } # Sort, for consistency with `epi_slide`, although the current # implementation doesn't take advantage of it. - ref_time_values <- sort(ref_time_values) + ref_time_values <- sort(.ref_time_values) } - validate_slide_window_arg(before, x$private$ungrouped$time_type) + validate_slide_window_arg(.before, .x$private$ungrouped$time_type) - checkmate::assert_string(new_col_name, null.ok = TRUE) - if (identical(new_col_name, "time_value")) { + checkmate::assert_string(.new_col_name, null.ok = TRUE) + if (identical(.new_col_name, "time_value")) { cli_abort('`new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation') # nolint: line_length_linter } - # Validate rest of parameters: - assert_logical(all_versions, len = 1L) + assert_logical(.all_versions, len = 1L) - # If `f` is missing, interpret ... as an expression for tidy evaluation - if (missing(f)) { + # If `.f` is missing, interpret ... as an expression for tidy evaluation + if (missing(.f)) { used_data_masking <- TRUE quosures <- enquos(...) if (length(quosures) == 0) { @@ -285,7 +294,7 @@ epix_slide.grouped_epi_archive <- function( assign("...", missing_arg()) } else { used_data_masking <- FALSE - f <- as_slide_computation(f, ...) + f <- as_slide_computation(.f, ...) } # Computation for one group, one time value @@ -344,10 +353,10 @@ epix_slide.grouped_epi_archive <- function( out <- lapply(ref_time_values, function(ref_time_value) { # Ungrouped as-of data; `epi_df` if `all_versions` is `FALSE`, # `epi_archive` if `all_versions` is `TRUE`: - as_of_raw <- x$private$ungrouped %>% epix_as_of( + as_of_raw <- .x$private$ungrouped %>% epix_as_of( ref_time_value, - min_time_value = ref_time_value - before, - all_versions = all_versions + min_time_value = ref_time_value - .before, + all_versions = .all_versions ) # Set: @@ -355,7 +364,7 @@ epix_slide.grouped_epi_archive <- function( # `group_modify` as the `.data` argument. Might or might not # include version column. # * `group_modify_fn`, the corresponding `.f` argument - if (!all_versions) { + if (!.all_versions) { as_of_df <- as_of_raw group_modify_fn <- comp_one_grp } else { @@ -366,7 +375,7 @@ epix_slide.grouped_epi_archive <- function( # behavior based on whether or not `dtplyr` is loaded. # Instead, go through an ordinary data frame, trying to avoid # copies. - if (address(as_of_archive$DT) == address(x$private$ungrouped$DT)) { + if (address(as_of_archive$DT) == address(.x$private$ungrouped$DT)) { # `as_of` aliased its the full `$DT`; copy before mutating: # # Note: this step is probably unneeded; we're fine with @@ -401,11 +410,11 @@ epix_slide.grouped_epi_archive <- function( return( dplyr::group_modify( - dplyr::group_by(as_of_df, !!!syms(x$private$vars), .drop = x$private$drop), + dplyr::group_by(as_of_df, !!!syms(.x$private$vars), .drop = .x$private$drop), group_modify_fn, f = f, ..., ref_time_value = ref_time_value, - new_col_name = new_col_name, + new_col_name = .new_col_name, .keep = TRUE ) ) @@ -413,7 +422,7 @@ epix_slide.grouped_epi_archive <- function( # Combine output into a single tibble (allowing for packed columns) out <- vctrs::vec_rbind(!!!out) # Reconstruct groups - out <- group_by(out, !!!syms(x$private$vars), .drop = x$private$drop) + out <- group_by(out, !!!syms(.x$private$vars), .drop = .x$private$drop) # nolint start: commented_code_linter. # if (is_epi_df(x)) { diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index a666e5f3..c89ed61c 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -601,92 +601,78 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' vignette](https://cmu-delphi.github.io/epiprocess/articles/archive.html) for #' examples. #' -#' @param x An [`epi_archive`] or [`grouped_epi_archive`] object. If ungrouped, +#' @param .x An [`epi_archive`] or [`grouped_epi_archive`] object. If ungrouped, #' all data in `x` will be treated as part of a single data group. -#' @param f Function, formula, or missing; together with `...` specifies the +#' @param .f Function, formula, or missing; together with `...` specifies the #' computation to slide. To "slide" means to apply a computation over a #' sliding (a.k.a. "rolling") time window for each data group. The window is #' determined by the `before` parameter described below. One time step is #' typically one day or one week; see [`epi_slide`] details for more -#' explanation. If a function, `f` must take an `epi_df` with the same +#' explanation. If a function, `.f` must take an `epi_df` with the same #' column names as the archive's `DT`, minus the `version` column; followed #' by a one-row tibble containing the values of the grouping variables for #' the associated group; followed by a reference time value, usually as a #' `Date` object; followed by any number of named arguments. If a formula, -#' `f` can operate directly on columns accessed via `.x$var` or `.$var`, as +#' `.f` can operate directly on columns accessed via `.x$var` or `.$var`, as #' in `~ mean (.x$var)` to compute a mean of a column `var` for each #' group-`ref_time_value` combination. The group key can be accessed via #' `.y` or `.group_key`, and the reference time value can be accessed via -#' `.z` or `.ref_time_value`. If `f` is missing, then `...` will specify the +#' `.z` or `.ref_time_value`. If `.f` is missing, then `...` will specify the #' computation. #' @param ... Additional arguments to pass to the function or formula specified -#' via `f`. Alternatively, if `f` is missing, then the `...` is interpreted as +#' via `f`. Alternatively, if `.f` is missing, then the `...` is interpreted as #' a ["data-masking"][rlang::args_data_masking] expression or expressions for #' tidy evaluation; in addition to referring columns directly by name, the #' expressions have access to `.data` and `.env` pronouns as in `dplyr` verbs, #' and can also refer to `.x`, `.group_key`, and `.ref_time_value`. See #' details. -#' @param before How far `before` each `ref_time_value` should the sliding -#' window extend? If provided, should be a single, non-NA, -#' [integer-compatible][vctrs::vec_cast] number of time steps. This window -#' endpoint is inclusive. For example, if `before = 7`, and one time step is -#' one day, then to produce a value for a `ref_time_value` of January 8, we -#' apply the given function or formula to data (for each group present) with -#' `time_value`s from January 1 onward, as they were reported on January 8. -#' For typical disease surveillance sources, this will not include any data -#' with a `time_value` of January 8, and, depending on the amount of reporting -#' latency, may not include January 7 or even earlier `time_value`s. (If -#' instead the archive were to hold nowcasts instead of regular surveillance -#' data, then we would indeed expect data for `time_value` January 8. If it -#' were to hold forecasts, then we would expect data for `time_value`s after -#' January 8, and the sliding window would extend as far after each -#' `ref_time_value` as needed to include all such `time_value`s.) -#' @param ref_time_values Reference time values / versions for sliding +#' @param .before How many time values before the `.ref_time_value` +#' should each snapshot handed to the function `.f` contain? If provided, it +#' should be a single value that is compatible with the time_type of the +#' time_value column (more below), but most commonly an integer. This window +#' endpoint is inclusive. For example, if `.before = 7`, `time_type` +#' in the archive is "day", and the `.ref_time_value` is January 8, then the +#' smallest time_value in the snapshot will be January 1. If missing, then the +#' default is no limit on the time values, so the full snapshot is given. +#' @param .ref_time_values Reference time values / versions for sliding #' computations; each element of this vector serves both as the anchor point #' for the `time_value` window for the computation and the `max_version` #' `epix_as_of` which we fetch data in this window. If missing, then this will #' set to a regularly-spaced sequence of values set to cover the range of #' `version`s in the `DT` plus the `versions_end`; the spacing of values will #' be guessed (using the GCD of the skips between values). -#' @param new_col_name String indicating the name of the new column that will +#' @param .new_col_name String indicating the name of the new column that will #' contain the derivative values. The default is "slide_value" unless your #' slide computations output data frames, in which case they will be unpacked #' into the constituent columns and those names used. Note that setting -#' `new_col_name` equal to an existing column name will overwrite this column. -#' @param all_versions (Not the same as `all_rows` parameter of `epi_slide`.) If -#' `all_versions = TRUE`, then `f` will be passed the version history (all -#' `version <= ref_time_value`) for rows having `time_value` between -#' `ref_time_value - before` and `ref_time_value`. Otherwise, `f` will be +#' `.new_col_name` equal to an existing column name will overwrite this column. +#' @param .all_versions (Not the same as `.all_rows` parameter of `epi_slide`.) If +#' TRUE, then `.f` will be passed the version history (all +#' `version <= .ref_time_value`) for rows having `time_value` between +#' `.ref_time_value - before` and `.ref_time_value`. Otherwise, `.f` will be #' passed only the most recent `version` for every unique `time_value`. #' Default is `FALSE`. #' @return A tibble whose columns are: the grouping variables, `time_value`, #' containing the reference time values for the slide computation, and a -#' column named according to the `new_col_name` argument, containing the slide +#' column named according to the `.new_col_name` argument, containing the slide #' values. #' #' @details A few key distinctions between the current function and `epi_slide()`: -#' 1. In `f` functions for `epix_slide`, one should not assume that the input +#' 1. In `.f` functions for `epix_slide`, one should not assume that the input #' data to contain any rows with `time_value` matching the computation's -#' `ref_time_value` (accessible via `attributes()$metadata$as_of`); for +#' `.ref_time_value` (accessible via `attributes()$metadata$as_of`); for #' typical epidemiological surveillance data, observations pertaining to a #' particular time period (`time_value`) are first reported `as_of` some #' instant after that time period has ended. -#' 2. `epix_slide()` doesn't accept an `after` argument; its windows extend -#' from `before` time steps before a given `ref_time_value` through the last -#' `time_value` available as of version `ref_time_value` (typically, this -#' won't include `ref_time_value` itself, as observations about a particular -#' time interval (e.g., day) are only published after that time interval -#' ends); `epi_slide` windows extend from `before` time steps before a -#' `ref_time_value` through `after` time steps after `ref_time_value`. -#' 3. The input class and columns are similar but different: `epix_slide` -#' (with the default `all_versions=FALSE`) keeps all columns and the +#' 2. The input class and columns are similar but different: `epix_slide` +#' (with the default `.all_versions=FALSE`) keeps all columns and the #' `epi_df`-ness of the first argument to each computation; `epi_slide` only #' provides the grouping variables in the second input, and will convert the #' first input into a regular tibble if the grouping variables include the -#' essential `geo_value` column. (With `all_versions=TRUE`, `epix_slide` will +#' essential `geo_value` column. (With .all_versions=TRUE`, `epix_slide` will #' will provide an `epi_archive` rather than an `epi-df` to each #' computation.) -#' 4. The output class and columns are similar but different: `epix_slide()` +#' 3. The output class and columns are similar but different: `epix_slide()` #' returns a tibble containing only the grouping variables, `time_value`, and #' the new column(s) from the slide computations, whereas `epi_slide()` #' returns an `epi_df` with all original variables plus the new columns from @@ -694,16 +680,16 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' their input, with one exception: `epi_archive`s can have trivial #' (zero-variable) groupings, but these will be dropped in `epix_slide` #' results as they are not supported by tibbles.) -#' 5. There are no size stability checks or element/row recycling to maintain +#' 4. There are no size stability checks or element/row recycling to maintain #' size stability in `epix_slide`, unlike in `epi_slide`. (`epix_slide` is #' roughly analogous to [`dplyr::group_modify`], while `epi_slide` is roughly #' analogous to `dplyr::mutate` followed by `dplyr::arrange`) This is detailed #' in the "advanced" vignette. -#' 6. `all_rows` is not supported in `epix_slide`; since the slide +#' 5. `.all_rows` is not supported in `epix_slide`; since the slide #' computations are allowed more flexibility in their outputs than in #' `epi_slide`, we can't guess a good representation for missing computations -#' for excluded group-`ref_time_value` pairs. -#' 7. The `ref_time_values` default for `epix_slide` is based on making an +#' for excluded group-`.ref_time_value` pairs. +#' 76. The `.ref_time_values` default for `epix_slide` is based on making an #' evenly-spaced sequence out of the `version`s in the `DT` plus the #' `versions_end`, rather than the `time_value`s. #' @@ -732,10 +718,10 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' archive_cases_dv_subset %>% #' group_by(geo_value) %>% #' epix_slide( -#' f = ~ mean(.x$case_rate_7d_av), -#' before = 2, -#' ref_time_values = ref_time_values, -#' new_col_name = "case_rate_7d_av_recent_av" +#' .f = ~ mean(.x$case_rate_7d_av), +#' .before = 2, +#' .ref_time_values = ref_time_values, +#' .new_col_name = "case_rate_7d_av_recent_av" #' ) %>% #' ungroup() #' # We requested time windows that started 2 days before the corresponding time @@ -748,7 +734,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' # * 2 `time_value`s, for the rest of the results #' # * never the 3 `time_value`s we would get from `epi_slide`, since, because #' # of data latency, we'll never have an observation -#' # `time_value == ref_time_value` as of `ref_time_value`. +#' # `time_value == .ref_time_value` as of `.ref_time_value`. #' # The example below shows this type of behavior in more detail. #' #' # Examining characteristics of the data passed to each computation with @@ -767,8 +753,8 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' class1 = class(x)[[1L]] #' ) #' }, -#' before = 5, all_versions = FALSE, -#' ref_time_values = ref_time_values +#' .before = 5, .all_versions = FALSE, +#' .ref_time_values = ref_time_values #' ) %>% #' ungroup() %>% #' arrange(geo_value, time_value) @@ -777,7 +763,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' #' # `epix_slide` with `all_versions=FALSE` (the default) applies a #' # version-unaware computation to several versions of the data. We can also -#' # use `all_versions=TRUE` to apply a version-*aware* computation to several +#' # use `.all_versions=TRUE` to apply a version-*aware* computation to several #' # versions of the data, again looking at characteristics of the data passed #' # to each computation. In this case, each computation should expect an #' # `epi_archive` containing the relevant version data: @@ -802,8 +788,8 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' class1 = class(x)[[1L]] #' ) #' }, -#' before = 5, all_versions = TRUE, -#' ref_time_values = ref_time_values +#' .before = 5, .all_versions = TRUE, +#' .ref_time_values = ref_time_values #' ) %>% #' ungroup() %>% #' # Focus on one geo_value so we can better see the columns above: @@ -812,13 +798,13 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' #' @export epix_slide <- function( - x, - f, + .x, + .f, ..., - before = Inf, - ref_time_values = NULL, - new_col_name = NULL, - all_versions = FALSE) { + .before = Inf, + .ref_time_values = NULL, + .new_col_name = NULL, + .all_versions = FALSE) { UseMethod("epix_slide") } @@ -826,22 +812,22 @@ epix_slide <- function( #' @rdname epix_slide #' @export epix_slide.epi_archive <- function( - x, - f, + .x, + .f, ..., - before = Inf, - ref_time_values = NULL, - new_col_name = NULL, - all_versions = FALSE) { + .before = Inf, + .ref_time_values = NULL, + .new_col_name = NULL, + .all_versions = FALSE) { # For an "ungrouped" slide, treat all rows as belonging to one big # group (group by 0 vars), like `dplyr::summarize`, and let the # resulting `grouped_epi_archive` handle the slide: epix_slide( - group_by(x), - f, + group_by(.x), + .f, ..., - before = before, ref_time_values = ref_time_values, new_col_name = new_col_name, - all_versions = all_versions + .before = .before, .ref_time_values = .ref_time_values, + .new_col_name = .new_col_name, .all_versions = .all_versions ) %>% # We want a slide on ungrouped archives to output something # ungrouped, rather than retaining the trivial (0-variable) diff --git a/R/slide.R b/R/slide.R index d488d681..02e45329 100644 --- a/R/slide.R +++ b/R/slide.R @@ -464,7 +464,7 @@ epi_slide_opt <- function( c( "input data `x` unexpectedly has 0 rows", "i" = "If this computation is occuring within an `epix_slide` call, - check that `epix_slide` `ref_time_values` argument was set appropriately" + check that `epix_slide` `.ref_time_values` argument was set appropriately" ), class = "epiprocess__epi_slide_opt__0_row_input", epiprocess__x = .x @@ -671,7 +671,7 @@ epi_slide_opt <- function( } if (!is_epi_df(result)) { - # `all_rows`handling strips epi_df format and metadata. + # `.all_rows`handling strips epi_df format and metadata. # Restore them. result <- reclass(result, attributes(.x)$metadata) } diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index 8c56982d..d2f0c68f 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -7,81 +7,74 @@ \title{Slide a function over variables in an \code{epi_archive} or \code{grouped_epi_archive}} \usage{ epix_slide( - x, - f, + .x, + .f, ..., - before = Inf, - ref_time_values = NULL, - new_col_name = NULL, - all_versions = FALSE + .before = Inf, + .ref_time_values = NULL, + .new_col_name = NULL, + .all_versions = FALSE ) \method{epix_slide}{epi_archive}( - x, - f, + .x, + .f, ..., - before = Inf, - ref_time_values = NULL, - new_col_name = NULL, - all_versions = FALSE + .before = Inf, + .ref_time_values = NULL, + .new_col_name = NULL, + .all_versions = FALSE ) \method{epix_slide}{grouped_epi_archive}( - x, - f, + .x, + .f, ..., - before = Inf, - ref_time_values = NULL, - new_col_name = NULL, - all_versions = FALSE + .before = Inf, + .ref_time_values = NULL, + .new_col_name = NULL, + .all_versions = FALSE ) } \arguments{ -\item{x}{An \code{\link{epi_archive}} or \code{\link{grouped_epi_archive}} object. If ungrouped, +\item{.x}{An \code{\link{epi_archive}} or \code{\link{grouped_epi_archive}} object. If ungrouped, all data in \code{x} will be treated as part of a single data group.} -\item{f}{Function, formula, or missing; together with \code{...} specifies the +\item{.f}{Function, formula, or missing; together with \code{...} specifies the computation to slide. To "slide" means to apply a computation over a sliding (a.k.a. "rolling") time window for each data group. The window is determined by the \code{before} parameter described below. One time step is typically one day or one week; see \code{\link{epi_slide}} details for more -explanation. If a function, \code{f} must take an \code{epi_df} with the same +explanation. If a function, \code{.f} must take an \code{epi_df} with the same column names as the archive's \code{DT}, minus the \code{version} column; followed by a one-row tibble containing the values of the grouping variables for the associated group; followed by a reference time value, usually as a \code{Date} object; followed by any number of named arguments. If a formula, -\code{f} can operate directly on columns accessed via \code{.x$var} or \code{.$var}, as +\code{.f} can operate directly on columns accessed via \code{.x$var} or \code{.$var}, as in \code{~ mean (.x$var)} to compute a mean of a column \code{var} for each group-\code{ref_time_value} combination. The group key can be accessed via \code{.y} or \code{.group_key}, and the reference time value can be accessed via -\code{.z} or \code{.ref_time_value}. If \code{f} is missing, then \code{...} will specify the +\code{.z} or \code{.ref_time_value}. If \code{.f} is missing, then \code{...} will specify the computation.} \item{...}{Additional arguments to pass to the function or formula specified -via \code{f}. Alternatively, if \code{f} is missing, then the \code{...} is interpreted as +via \code{f}. Alternatively, if \code{.f} is missing, then the \code{...} is interpreted as a \link[rlang:args_data_masking]{"data-masking"} expression or expressions for tidy evaluation; in addition to referring columns directly by name, the expressions have access to \code{.data} and \code{.env} pronouns as in \code{dplyr} verbs, and can also refer to \code{.x}, \code{.group_key}, and \code{.ref_time_value}. See details.} -\item{before}{How far \code{before} each \code{ref_time_value} should the sliding -window extend? If provided, should be a single, non-NA, -\link[vctrs:vec_cast]{integer-compatible} number of time steps. This window -endpoint is inclusive. For example, if \code{before = 7}, and one time step is -one day, then to produce a value for a \code{ref_time_value} of January 8, we -apply the given function or formula to data (for each group present) with -\code{time_value}s from January 1 onward, as they were reported on January 8. -For typical disease surveillance sources, this will not include any data -with a \code{time_value} of January 8, and, depending on the amount of reporting -latency, may not include January 7 or even earlier \code{time_value}s. (If -instead the archive were to hold nowcasts instead of regular surveillance -data, then we would indeed expect data for \code{time_value} January 8. If it -were to hold forecasts, then we would expect data for \code{time_value}s after -January 8, and the sliding window would extend as far after each -\code{ref_time_value} as needed to include all such \code{time_value}s.)} +\item{.before}{How many time values before the \code{.ref_time_value} +should each snapshot handed to the function \code{.f} contain? If provided, it +should be a single value that is compatible with the time_type of the +time_value column (more below), but most commonly an integer. This window +endpoint is inclusive. For example, if \code{.before = 7}, \code{time_type} +in the archive is "day", and the \code{.ref_time_value} is January 8, then the +smallest time_value in the snapshot will be January 1. If missing, then the +default is no limit on the time values, so the full snapshot is given.} -\item{ref_time_values}{Reference time values / versions for sliding +\item{.ref_time_values}{Reference time values / versions for sliding computations; each element of this vector serves both as the anchor point for the \code{time_value} window for the computation and the \code{max_version} \code{epix_as_of} which we fetch data in this window. If missing, then this will @@ -89,23 +82,23 @@ set to a regularly-spaced sequence of values set to cover the range of \code{version}s in the \code{DT} plus the \code{versions_end}; the spacing of values will be guessed (using the GCD of the skips between values).} -\item{new_col_name}{String indicating the name of the new column that will +\item{.new_col_name}{String indicating the name of the new column that will contain the derivative values. The default is "slide_value" unless your slide computations output data frames, in which case they will be unpacked into the constituent columns and those names used. Note that setting -\code{new_col_name} equal to an existing column name will overwrite this column.} +\code{.new_col_name} equal to an existing column name will overwrite this column.} -\item{all_versions}{(Not the same as \code{all_rows} parameter of \code{epi_slide}.) If -\code{all_versions = TRUE}, then \code{f} will be passed the version history (all -\code{version <= ref_time_value}) for rows having \code{time_value} between -\code{ref_time_value - before} and \code{ref_time_value}. Otherwise, \code{f} will be +\item{.all_versions}{(Not the same as \code{.all_rows} parameter of \code{epi_slide}.) If +TRUE, then \code{.f} will be passed the version history (all +\code{version <= .ref_time_value}) for rows having \code{time_value} between +\code{.ref_time_value - before} and \code{.ref_time_value}. Otherwise, \code{.f} will be passed only the most recent \code{version} for every unique \code{time_value}. Default is \code{FALSE}.} } \value{ A tibble whose columns are: the grouping variables, \code{time_value}, containing the reference time values for the slide computation, and a -column named according to the \code{new_col_name} argument, containing the slide +column named according to the \code{.new_col_name} argument, containing the slide values. } \description{ @@ -119,26 +112,18 @@ examples. \details{ A few key distinctions between the current function and \code{epi_slide()}: \enumerate{ -\item In \code{f} functions for \code{epix_slide}, one should not assume that the input +\item In \code{.f} functions for \code{epix_slide}, one should not assume that the input data to contain any rows with \code{time_value} matching the computation's -\code{ref_time_value} (accessible via \verb{attributes()$metadata$as_of}); for +\code{.ref_time_value} (accessible via \verb{attributes()$metadata$as_of}); for typical epidemiological surveillance data, observations pertaining to a particular time period (\code{time_value}) are first reported \code{as_of} some instant after that time period has ended. -\item \code{epix_slide()} doesn't accept an \code{after} argument; its windows extend -from \code{before} time steps before a given \code{ref_time_value} through the last -\code{time_value} available as of version \code{ref_time_value} (typically, this -won't include \code{ref_time_value} itself, as observations about a particular -time interval (e.g., day) are only published after that time interval -ends); \code{epi_slide} windows extend from \code{before} time steps before a -\code{ref_time_value} through \code{after} time steps after \code{ref_time_value}. \item The input class and columns are similar but different: \code{epix_slide} -(with the default \code{all_versions=FALSE}) keeps all columns and the +(with the default \code{.all_versions=FALSE}) keeps all columns and the \code{epi_df}-ness of the first argument to each computation; \code{epi_slide} only provides the grouping variables in the second input, and will convert the first input into a regular tibble if the grouping variables include the -essential \code{geo_value} column. (With \code{all_versions=TRUE}, \code{epix_slide} will -will provide an \code{epi_archive} rather than an \code{epi-df} to each +essential \code{geo_value} column. (With .all_versions=TRUE\verb{, }epix_slide\verb{will will provide an}epi_archive\verb{rather than an}epi-df` to each computation.) \item The output class and columns are similar but different: \code{epix_slide()} returns a tibble containing only the grouping variables, \code{time_value}, and @@ -153,11 +138,11 @@ size stability in \code{epix_slide}, unlike in \code{epi_slide}. (\code{epix_sli roughly analogous to \code{\link[dplyr:group_map]{dplyr::group_modify}}, while \code{epi_slide} is roughly analogous to \code{dplyr::mutate} followed by \code{dplyr::arrange}) This is detailed in the "advanced" vignette. -\item \code{all_rows} is not supported in \code{epix_slide}; since the slide +\item \code{.all_rows} is not supported in \code{epix_slide}; since the slide computations are allowed more flexibility in their outputs than in \code{epi_slide}, we can't guess a good representation for missing computations -for excluded group-\code{ref_time_value} pairs. -\item The \code{ref_time_values} default for \code{epix_slide} is based on making an +for excluded group-\code{.ref_time_value} pairs. +\item The \code{.ref_time_values} default for \code{epix_slide} is based on making an evenly-spaced sequence out of the \code{version}s in the \code{DT} plus the \code{versions_end}, rather than the \code{time_value}s. } @@ -187,10 +172,10 @@ ref_time_values <- seq(as.Date("2020-06-01"), archive_cases_dv_subset \%>\% group_by(geo_value) \%>\% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = ref_time_values, - new_col_name = "case_rate_7d_av_recent_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = ref_time_values, + .new_col_name = "case_rate_7d_av_recent_av" ) \%>\% ungroup() # We requested time windows that started 2 days before the corresponding time @@ -203,7 +188,7 @@ archive_cases_dv_subset \%>\% # * 2 `time_value`s, for the rest of the results # * never the 3 `time_value`s we would get from `epi_slide`, since, because # of data latency, we'll never have an observation -# `time_value == ref_time_value` as of `ref_time_value`. +# `time_value == .ref_time_value` as of `.ref_time_value`. # The example below shows this type of behavior in more detail. # Examining characteristics of the data passed to each computation with @@ -222,8 +207,8 @@ archive_cases_dv_subset \%>\% class1 = class(x)[[1L]] ) }, - before = 5, all_versions = FALSE, - ref_time_values = ref_time_values + .before = 5, .all_versions = FALSE, + .ref_time_values = ref_time_values ) \%>\% ungroup() \%>\% arrange(geo_value, time_value) @@ -232,7 +217,7 @@ archive_cases_dv_subset \%>\% # `epix_slide` with `all_versions=FALSE` (the default) applies a # version-unaware computation to several versions of the data. We can also -# use `all_versions=TRUE` to apply a version-*aware* computation to several +# use `.all_versions=TRUE` to apply a version-*aware* computation to several # versions of the data, again looking at characteristics of the data passed # to each computation. In this case, each computation should expect an # `epi_archive` containing the relevant version data: @@ -257,8 +242,8 @@ archive_cases_dv_subset \%>\% class1 = class(x)[[1L]] ) }, - before = 5, all_versions = TRUE, - ref_time_values = ref_time_values + .before = 5, .all_versions = TRUE, + .ref_time_values = ref_time_values ) \%>\% ungroup() \%>\% # Focus on one geo_value so we can better see the columns above: diff --git a/man/group_by.epi_archive.Rd b/man/group_by.epi_archive.Rd index 782d5f3f..e7c46311 100644 --- a/man/group_by.epi_archive.Rd +++ b/man/group_by.epi_archive.Rd @@ -90,10 +90,10 @@ grouped_archive \%>\% print() archive_cases_dv_subset \%>\% group_by(geo_value) \%>\% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = as.Date("2020-06-11") + 0:2, - new_col_name = "case_rate_3d_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = as.Date("2020-06-11") + 0:2, + .new_col_name = "case_rate_3d_av" ) \%>\% ungroup() @@ -138,7 +138,7 @@ toy_archive \%>\% toy_archive \%>\% group_by(geo_value, age_group, .drop = FALSE) \%>\% - epix_slide(f = ~ sum(.x$value), before = 20) \%>\% + epix_slide(.f = ~ sum(.x$value), .before = 20) \%>\% ungroup() } diff --git a/tests/testthat/test-deprecations.R b/tests/testthat/test-deprecations.R index 7d29149b..3a82f615 100644 --- a/tests/testthat/test-deprecations.R +++ b/tests/testthat/test-deprecations.R @@ -1,47 +1,47 @@ test_that("epix_slide group_by= deprecation works", { expect_error( archive_cases_dv_subset %>% - epix_slide(function(...) {}, before = 2L, group_by = c()), + epix_slide(function(...) {}, .before = 2L, group_by = c()), class = "epiprocess__epix_slide_group_by_parameter_deprecated" ) expect_error( archive_cases_dv_subset %>% - epix_slide(function(...) {}, before = 2L, group_by = c()), + epix_slide(function(...) {}, .before = 2L, group_by = c()), class = "epiprocess__epix_slide_group_by_parameter_deprecated" ) expect_error( archive_cases_dv_subset %>% group_by(geo_value) %>% - epix_slide(function(...) {}, before = 2L, group_by = c()), + epix_slide(function(...) {}, .before = 2L, group_by = c()), class = "epiprocess__epix_slide_group_by_parameter_deprecated" ) expect_error( archive_cases_dv_subset %>% group_by(geo_value) %>% - epix_slide(function(...) {}, before = 2L, group_by = c()), + epix_slide(function(...) {}, .before = 2L, group_by = c()), class = "epiprocess__epix_slide_group_by_parameter_deprecated" ) # expect_error( archive_cases_dv_subset %>% - epix_slide(function(...) {}, before = 2L, all_rows = TRUE), + epix_slide(function(...) {}, .before = 2L, all_rows = TRUE), class = "epiprocess__epix_slide_all_rows_parameter_deprecated" ) expect_error( archive_cases_dv_subset %>% - epix_slide(function(...) {}, before = 2L, all_rows = TRUE), + epix_slide(function(...) {}, .before = 2L, all_rows = TRUE), class = "epiprocess__epix_slide_all_rows_parameter_deprecated" ) expect_error( archive_cases_dv_subset %>% group_by(geo_value) %>% - epix_slide(function(...) {}, before = 2L, all_rows = TRUE), + epix_slide(function(...) {}, .before = 2L, all_rows = TRUE), class = "epiprocess__epix_slide_all_rows_parameter_deprecated" ) expect_error( archive_cases_dv_subset %>% group_by(geo_value) %>% - epix_slide(function(...) {}, before = 2L, all_rows = TRUE), + epix_slide(function(...) {}, .before = 2L, all_rows = TRUE), class = "epiprocess__epix_slide_all_rows_parameter_deprecated" ) }) diff --git a/tests/testthat/test-epix_slide.R b/tests/testthat/test-epix_slide.R index 2151a82c..87edfdb5 100644 --- a/tests/testthat/test-epix_slide.R +++ b/tests/testthat/test-epix_slide.R @@ -22,9 +22,9 @@ test_that("epix_slide works as intended", { xx1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ sum(.x$binary), - before = 2, - new_col_name = "sum_binary" + .f = ~ sum(.x$binary), + .before = 2, + .new_col_name = "sum_binary" ) xx2 <- tibble( @@ -44,9 +44,9 @@ test_that("epix_slide works as intended", { xx3 <- xx %>% group_by(dplyr::across(dplyr::all_of("geo_value"))) %>% epix_slide( - f = ~ sum(.x$binary), - before = 2, - new_col_name = "sum_binary" + .f = ~ sum(.x$binary), + .before = 2, + .new_col_name = "sum_binary" ) expect_identical(xx1, xx3) # This and * imply xx2 and xx3 are identical @@ -54,9 +54,9 @@ test_that("epix_slide works as intended", { # function interface xx4 <- xx %>% group_by(.data$geo_value) %>% - epix_slide(f = function(x, gk, rtv) { + epix_slide(.f = function(x, gk, rtv) { tibble::tibble(sum_binary = sum(x$binary)) - }, before = 2) + }, .before = 2) expect_identical(xx1, xx4) @@ -65,7 +65,7 @@ test_that("epix_slide works as intended", { group_by(.data$geo_value) %>% epix_slide( sum_binary = sum(binary), - before = 2 + .before = 2 ) expect_identical(xx1, xx5) @@ -75,8 +75,8 @@ test_that("epix_slide works as intended with list cols", { xx_dfrow1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ list(data.frame(bin_sum = sum(.x$binary))), - before = 2 + .f = ~ list(data.frame(bin_sum = sum(.x$binary))), + .before = 2 ) xx_dfrow2 <- tibble( geo_value = rep("ak", 4), @@ -95,16 +95,16 @@ test_that("epix_slide works as intended with list cols", { xx_dfrow3 <- xx %>% group_by(dplyr::across(dplyr::all_of("geo_value"))) %>% epix_slide( - f = ~ list(data.frame(bin_sum = sum(.x$binary))), - before = 2 + .f = ~ list(data.frame(bin_sum = sum(.x$binary))), + .before = 2 ) expect_identical(xx_dfrow1, xx_dfrow3) # This and * Imply xx_dfrow2 and xx_dfrow3 are identical xx_df1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ list(data.frame(bin = .x$binary)), - before = 2 + .f = ~ list(data.frame(bin = .x$binary)), + .before = 2 ) xx_df2 <- tibble( geo_value = rep("ak", 4), @@ -123,8 +123,8 @@ test_that("epix_slide works as intended with list cols", { xx_scalar1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ list(sum(.x$binary)), - before = 2 + .f = ~ list(sum(.x$binary)), + .before = 2 ) xx_scalar2 <- tibble( geo_value = rep("ak", 4), @@ -143,8 +143,8 @@ test_that("epix_slide works as intended with list cols", { xx_vec1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ list(.x$binary), - before = 2 + .f = ~ list(.x$binary), + .before = 2 ) xx_vec2 <- tibble( geo_value = rep("ak", 4), @@ -161,23 +161,23 @@ test_that("epix_slide works as intended with list cols", { expect_identical(xx_vec1, xx_vec2) }) -test_that("epix_slide `before` validation works", { +test_that("epix_slide `.before` validation works", { expect_error( - xx %>% epix_slide(f = ~ sum(.x$binary), before = NA), - "Slide function expected `before` to be a scalar value." + xx %>% epix_slide(.f = ~ sum(.x$binary), .before = NA), + class = "epiprocess__validate_slide_window_arg" ) expect_error( - xx %>% epix_slide(f = ~ sum(.x$binary), before = -1), - "Slide function expected `before` to be a difftime with units in days or non-negative integer or Inf." + xx %>% epix_slide(.f = ~ sum(.x$binary), .before = -1), + class = "epiprocess__validate_slide_window_arg" ) expect_error( - xx %>% epix_slide(f = ~ sum(.x$binary), before = 1.5), - "Slide function expected `before` to be a difftime with units in days or non-negative integer or Inf." + xx %>% epix_slide(.f = ~ sum(.x$binary), .before = 1.5), + class = "epiprocess__validate_slide_window_arg" ) # These `before` values should be accepted: - expect_no_error(xx %>% epix_slide(f = ~ sum(.x$binary), before = 0)) - expect_no_error(xx %>% epix_slide(f = ~ sum(.x$binary), before = 2)) - expect_no_error(xx %>% epix_slide(f = ~ sum(.x$binary), before = as.difftime(365000, units = "days"))) + expect_no_error(xx %>% epix_slide(.f = ~ sum(.x$binary), .before = 0)) + expect_no_error(xx %>% epix_slide(.f = ~ sum(.x$binary), .before = 2)) + expect_no_error(xx %>% epix_slide(.f = ~ sum(.x$binary), .before = as.difftime(365000, units = "days"))) }) test_that("quosure passing issue in epix_slide is resolved + other potential issues", { @@ -198,18 +198,18 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss reference_by_modulus <- ea %>% group_by(modulus) %>% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ) reference_by_neither <- ea %>% group_by() %>% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ) # test the passing-something-that-must-be-enquosed behavior: # @@ -218,21 +218,21 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss ea %>% group_by(modulus) %>% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_modulus ) # test the .data pronoun behavior: expect_identical( epix_slide( - x = ea %>% group_by(.data$modulus), - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .x = ea %>% group_by(.data$modulus), + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_modulus ) @@ -240,21 +240,21 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss ea %>% group_by(.data$modulus) %>% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_modulus ) # test the passing across-all-of-string-literal behavior: expect_identical( epix_slide( - x = ea %>% group_by(dplyr::across(all_of("modulus"))), - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .x = ea %>% group_by(dplyr::across(all_of("modulus"))), + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_modulus ) @@ -262,10 +262,10 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss ea %>% group_by(across(all_of("modulus"))) %>% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_modulus ) @@ -273,11 +273,11 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss my_group_by <- "modulus" expect_identical( epix_slide( - x = ea %>% group_by(dplyr::across(tidyselect::all_of(my_group_by))), - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .x = ea %>% group_by(dplyr::across(tidyselect::all_of(my_group_by))), + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_modulus ) @@ -285,30 +285,30 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss ea %>% group_by(dplyr::across(tidyselect::all_of(my_group_by))) %>% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_modulus ) # test the default behavior (default in this case should just be grouping by neither): expect_identical( epix_slide( - x = ea, - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .x = ea, + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_neither ) expect_identical( ea %>% epix_slide( - f = ~ mean(.x$case_rate_7d_av), - before = 2, - ref_time_values = time_values, - new_col_name = "case_rate_3d_av" + .f = ~ mean(.x$case_rate_7d_av), + .before = 2, + .ref_time_values = time_values, + .new_col_name = "case_rate_3d_av" ), reference_by_neither ) @@ -327,7 +327,7 @@ ea <- tibble::tribble( mutate(geo_value = "ak") %>% as_epi_archive() -test_that("epix_slide with all_versions option has access to all older versions", { +test_that("epix_slide with .all_versions option has access to all older versions", { slide_fn <- function(x, gk, rtv) { return(tibble( n_versions = length(unique(x$DT$version)), @@ -342,9 +342,9 @@ test_that("epix_slide with all_versions option has access to all older versions" result1 <- ea %>% group_by() %>% epix_slide( - f = slide_fn, - before = 10^3, - all_versions = TRUE + .f = slide_fn, + .before = 10^3, + .all_versions = TRUE ) expect_true(inherits(result1, "tbl_df")) @@ -364,9 +364,9 @@ test_that("epix_slide with all_versions option has access to all older versions" result3 <- ea %>% group_by() %>% epix_slide( - f = slide_fn, - before = 10^3, - all_versions = TRUE + .f = slide_fn, + .before = 10^3, + .all_versions = TRUE ) expect_identical(result1, result3) # This and * Imply result2 and result3 are identical @@ -375,9 +375,9 @@ test_that("epix_slide with all_versions option has access to all older versions" result4 <- ea %>% group_by() %>% epix_slide( - f = ~ slide_fn(.x, .y), - before = 10^3, - all_versions = TRUE + .f = ~ slide_fn(.x, .y), + .before = 10^3, + .all_versions = TRUE ) expect_identical(result1, result4) # This and * Imply result2 and result4 are identical @@ -389,8 +389,8 @@ test_that("epix_slide with all_versions option has access to all older versions" # unfortunately, we can't pass this directly as `f` and need an extra comma , slide_fn(.x, .group_key, .ref_time_value), - before = 10^3, - all_versions = TRUE + .before = 10^3, + .all_versions = TRUE ) expect_identical(result1, result5) # This and * Imply result2 and result5 are identical @@ -398,7 +398,7 @@ test_that("epix_slide with all_versions option has access to all older versions" }) test_that("epix_as_of and epix_slide with long enough window are compatible", { - # For all_versions = FALSE: + # For .all_versions = FALSE: f1 <- function(x, gk, rtv) { tibble( diff_mean = mean(diff(x$binary)) @@ -410,12 +410,12 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { ea %>% epix_as_of(ref_time_value1) %>% f1() %>% mutate(time_value = ref_time_value1, .before = 1L), ea %>% epix_slide( f1, - before = 1000, - ref_time_values = ref_time_value1 + .before = 1000, + .ref_time_values = ref_time_value1 ) ) - # For all_versions = TRUE: + # For .all_versions = TRUE: f2 <- function(x, gk, rtv) { x %>% # extract time&version-lag-1 data: @@ -427,7 +427,7 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { rename(real_time_value = time_value, lag1 = binary) )) }, - before = 1 + .before = 1 ) %>% # assess as nowcast: unnest(data) %>% @@ -446,9 +446,9 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { mutate(time_value = ref_time_value2, .before = 1L), ea %>% epix_slide( f2, - before = 1000, - ref_time_values = ref_time_value2, - all_versions = TRUE + .before = 1000, + .ref_time_values = ref_time_value2, + .all_versions = TRUE ) ) @@ -465,9 +465,9 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { group_by(geo_value) %>% epix_slide( f2, - before = 1000, - ref_time_values = ref_time_value2, - all_versions = TRUE + .before = 1000, + .ref_time_values = ref_time_value2, + .all_versions = TRUE ) %>% filter(geo_value == "ak"), ea %>% # using `ea` here is like filtering `ea_multigeo` to `geo_value=="x"` @@ -478,7 +478,7 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { ) }) -test_that("epix_slide `f` is passed an ungrouped `epi_archive` when `all_versions=TRUE`", { +test_that("epix_slide `f` is passed an ungrouped `epi_archive` when `.all_versions=TRUE`", { slide_fn <- function(x, gk, rtv) { expect_class(x, "epi_archive") return(NA) @@ -487,22 +487,22 @@ test_that("epix_slide `f` is passed an ungrouped `epi_archive` when `all_version ea %>% group_by() %>% epix_slide( - f = slide_fn, - before = 1, - ref_time_values = test_date + 5, - new_col_name = "out", - all_versions = TRUE + .f = slide_fn, + .before = 1, + .ref_time_values = test_date + 5, + .new_col_name = "out", + .all_versions = TRUE ) }) -test_that("epix_slide with all_versions option works as intended", { +test_that("epix_slide with .all_versions option works as intended", { xx1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~ sum(.x$DT$binary), - before = 2, - new_col_name = "sum_binary", - all_versions = TRUE + .f = ~ sum(.x$DT$binary), + .before = 2, + .new_col_name = "sum_binary", + .all_versions = TRUE ) xx2 <- tibble( @@ -522,10 +522,10 @@ test_that("epix_slide with all_versions option works as intended", { xx3 <- xx %>% group_by(dplyr::across(dplyr::all_of("geo_value"))) %>% epix_slide( - f = ~ sum(.x$DT$binary), - before = 2, - new_col_name = "sum_binary", - all_versions = TRUE + .f = ~ sum(.x$DT$binary), + .before = 2, + .new_col_name = "sum_binary", + .all_versions = TRUE ) expect_identical(xx1, xx3) # This and * Imply xx2 and xx3 are identical @@ -544,7 +544,7 @@ test_that("epix_slide with all_versions option works as intended", { # expect_identical( # ea_updated_stale %>% # group_by(geo_value) %>% -# epix_slide(~ slice_head(.x, n = 1L), before = 10L) %>% +# epix_slide(~ slice_head(.x, n = 1L), .before = 10L) %>% # ungroup() %>% # attr("metadata") %>% # .$as_of, @@ -556,7 +556,7 @@ test_that("epix_slide with all_versions option works as intended", { test_that("epix_slide works with 0-row computation outputs", { epix_slide_empty <- function(ea, ...) { ea %>% - epix_slide(before = 5, ..., function(x, gk, rtv) { + epix_slide(.before = 5, ..., function(x, gk, rtv) { tibble::tibble() }) } @@ -577,11 +577,11 @@ test_that("epix_slide works with 0-row computation outputs", { ) %>% group_by(geo_value) ) - # with `all_versions=TRUE`, we have something similar but never get an + # with `.all_versions=TRUE`, we have something similar but never get an # `epi_df`: expect_identical( ea %>% - epix_slide_empty(all_versions = TRUE), + epix_slide_empty(.all_versions = TRUE), tibble::tibble( time_value = ea$DT$version[integer(0)] ) @@ -589,7 +589,7 @@ test_that("epix_slide works with 0-row computation outputs", { expect_identical( ea %>% group_by(geo_value) %>% - epix_slide_empty(all_versions = TRUE), + epix_slide_empty(.all_versions = TRUE), tibble::tibble( geo_value = ea$DT$geo_value[integer(0)], time_value = ea$DT$version[integer(0)] @@ -601,11 +601,11 @@ test_that("epix_slide works with 0-row computation outputs", { test_that("epix_slide alerts if the provided f doesn't take enough args", { f_xgt <- function(x, g, t) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) # If `regexp` is NA, asserts that there should be no errors/messages. - expect_error(epix_slide(xx, f = f_xgt, before = 2), regexp = NA) - expect_warning(epix_slide(xx, f = f_xgt, before = 2), regexp = NA) + expect_error(epix_slide(xx, .f = f_xgt, .before = 2), regexp = NA) + expect_warning(epix_slide(xx, .f = f_xgt, .before = 2), regexp = NA) f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) - expect_warning(epix_slide(xx, f_x_dots, before = 2), + expect_warning(epix_slide(xx, f_x_dots, .before = 2), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) }) @@ -621,8 +621,8 @@ test_that("epix_slide computation via formula can use ref_time_value", { xx1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~.ref_time_value, - before = 2 + .f = ~.ref_time_value, + .before = 2 ) expect_identical(xx1, xx_ref) @@ -630,8 +630,8 @@ test_that("epix_slide computation via formula can use ref_time_value", { xx2 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~.z, - before = 2 + .f = ~.z, + .before = 2 ) expect_identical(xx2, xx_ref) @@ -639,8 +639,8 @@ test_that("epix_slide computation via formula can use ref_time_value", { xx3 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = ~..3, - before = 2 + .f = ~..3, + .before = 2 ) expect_identical(xx3, xx_ref) @@ -657,8 +657,8 @@ test_that("epix_slide computation via function can use ref_time_value", { xx1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - f = function(x, g, t) t, - before = 2 + .f = function(x, g, t) t, + .before = 2 ) expect_identical(xx1, xx_ref) @@ -676,7 +676,7 @@ test_that("epix_slide computation via dots can use ref_time_value and group", { xx1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - before = 2, + .before = 2, slide_value = .ref_time_value ) @@ -694,7 +694,7 @@ test_that("epix_slide computation via dots can use ref_time_value and group", { xx3 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - before = 2, + .before = 2, slide_value = .group_key$geo_value ) @@ -705,7 +705,7 @@ test_that("epix_slide computation via dots can use ref_time_value and group", { xx %>% group_by(.data$geo_value) %>% epix_slide( - before = 2, + .before = 2, slide_value = nrow(.group_key) ), NA @@ -716,14 +716,14 @@ test_that("epix_slide computation via dots outputs the same result using col nam xx_ref <- xx %>% group_by(.data$geo_value) %>% epix_slide( - before = 2, + .before = 2, sum_binary = sum(binary) ) xx1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - before = 2, + .before = 2, sum_binary = sum(.x$binary) ) @@ -732,7 +732,7 @@ test_that("epix_slide computation via dots outputs the same result using col nam xx2 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - before = 2, + .before = 2, sum_binary = sum(.data$binary) ) @@ -744,7 +744,7 @@ test_that("`epix_slide` doesn't decay date output", { xx$DT %>% as_tibble() %>% as_epi_archive() %>% - epix_slide(before = 5, ~ attr(.x, "metadata")$as_of) %>% + epix_slide(.before = 5, ~ attr(.x, "metadata")$as_of) %>% `[[`("slide_value") %>% inherits("Date") ) @@ -752,21 +752,21 @@ test_that("`epix_slide` doesn't decay date output", { test_that("`epix_slide` can access objects inside of helper functions", { helper <- function(archive_haystack, time_value_needle) { - archive_haystack %>% epix_slide(has_needle = time_value_needle %in% time_value, before = Inf) + archive_haystack %>% epix_slide(has_needle = time_value_needle %in% time_value, .before = Inf) } expect_no_error(helper(archive_cases_dv_subset, as.Date("2021-01-01"))) expect_no_error(helper(xx, 3L)) }) -test_that("`epix_slide` works with before = Inf", { +test_that("`epix_slide` works with .before = Inf", { expect_equal( xx %>% group_by(geo_value) %>% - epix_slide(sum_binary = sum(binary), before = Inf) %>% + epix_slide(sum_binary = sum(binary), .before = Inf) %>% pull(sum_binary), xx %>% group_by(geo_value) %>% - epix_slide(sum_binary = sum(binary), before = 365000) %>% + epix_slide(sum_binary = sum(binary), .before = 365000) %>% pull(sum_binary) ) }) diff --git a/tests/testthat/test-grouped_epi_archive.R b/tests/testthat/test-grouped_epi_archive.R index 6ae009ca..388ed614 100644 --- a/tests/testthat/test-grouped_epi_archive.R +++ b/tests/testthat/test-grouped_epi_archive.R @@ -50,7 +50,7 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { ) expect_identical( grouped_factor_then_nonfactor %>% - epix_slide(before = 10, s = sum(value)), + epix_slide(.before = 10, s = sum(value)), tibble::tribble( ~age_group, ~geo_value, ~time_value, ~s, "pediatric", NA_character_, "2000-01-02", 0, @@ -67,7 +67,7 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { expect_identical( toy_archive %>% group_by(geo_value, age_group, .drop = FALSE) %>% - epix_slide(before = 10, s = sum(value)), + epix_slide(.before = 10, s = sum(value)), tibble::tribble( ~geo_value, ~age_group, ~time_value, ~s, "us", "pediatric", "2000-01-02", 0, diff --git a/vignettes/advanced.Rmd b/vignettes/advanced.Rmd index d712b991..f66b0494 100644 --- a/vignettes/advanced.Rmd +++ b/vignettes/advanced.Rmd @@ -106,7 +106,7 @@ edf %>% mutate(version = time_value) %>% as_epi_archive() %>% group_by(geo_value) %>% - epix_slide(x_2dav = mean(x), before = 1, ref_time_values = as.Date("2020-06-02")) %>% + epix_slide(x_2dav = mean(x), .before = 1, .ref_time_values = as.Date("2020-06-02")) %>% ungroup() edf %>% @@ -114,7 +114,7 @@ edf %>% mutate(version = time_value) %>% as_epi_archive() %>% group_by(geo_value) %>% - epix_slide(~ mean(.x$x), before = 1, ref_time_values = as.Date("2020-06-02")) %>% + epix_slide(~ mean(.x$x), .before = 1, .ref_time_values = as.Date("2020-06-02")) %>% ungroup() ``` @@ -429,7 +429,7 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, .data$geo_value, .data$time_value, args = prob_arx_args(ahead = ahead) ), - before = 219, ref_time_values = fc_time_values + .before = 219, .ref_time_values = fc_time_values ) %>% mutate( target_date = .data$time_value + ahead, as_of = TRUE, diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index c5cc154b..d0deaf52 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -355,8 +355,8 @@ fc_time_values <- seq(as.Date("2020-08-01"), z <- x %>% group_by(geo_value) %>% epix_slide( - fc = prob_arx(x = percent_cli, y = case_rate_7d_av), before = 119, - ref_time_values = fc_time_values + fc = prob_arx(x = percent_cli, y = case_rate_7d_av), .before = 119, + .ref_time_values = fc_time_values ) %>% ungroup() @@ -392,8 +392,8 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { x %>% group_by(.data$geo_value) %>% epix_slide( - fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, ahead = ahead), before = 119, - ref_time_values = fc_time_values + fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, ahead = ahead), .before = 119, + .ref_time_values = fc_time_values ) %>% mutate(target_date = .data$time_value + ahead, as_of = TRUE) %>% ungroup() diff --git a/vignettes/compactify.Rmd b/vignettes/compactify.Rmd index 8579be6a..72a2d266 100644 --- a/vignettes/compactify.Rmd +++ b/vignettes/compactify.Rmd @@ -101,7 +101,7 @@ speeds <- rbind(speeds, speed_test(iterate_as_of, "as_of_1000x")) # Performance of slide slide_median <- function(my_ea) { - my_ea %>% epix_slide(median = median(.data$case_rate_7d_av), before = 7) + my_ea %>% epix_slide(median = median(.data$case_rate_7d_av), .before = 7) } speeds <- rbind(speeds, speed_test(slide_median, "slide_median")) diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 892b6cca..7ec6cc9b 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -276,7 +276,7 @@ so, we encapsulate the process of generating forecasts into a simple function, so that we can call it a few times. ```{r, message = FALSE, warning = FALSE, fig.width = 9, fig.height = 6} -# Note the use of all_rows = TRUE (keeps all original rows in the output) +# Note the use of .all_rows = TRUE (keeps all original rows in the output) k_week_ahead <- function(x, ahead = 7) { x %>% group_by(.data$geo_value) %>% From c0f64991015c119339b59c868e62d21b14b76829 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 23 Aug 2024 17:18:20 -0700 Subject: [PATCH 057/110] doc: improve the .f documentation for epi_slide and epix_slide --- R/methods-epi_archive.R | 37 ++++++++++++++++++++----------------- R/slide.R | 27 ++++++++++++++++----------- man/epi_slide.Rd | 27 ++++++++++++++++----------- man/epix_slide.Rd | 38 +++++++++++++++++++++----------------- 4 files changed, 73 insertions(+), 56 deletions(-) diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index c89ed61c..0294237f 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -606,26 +606,29 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' @param .f Function, formula, or missing; together with `...` specifies the #' computation to slide. To "slide" means to apply a computation over a #' sliding (a.k.a. "rolling") time window for each data group. The window is -#' determined by the `before` parameter described below. One time step is -#' typically one day or one week; see [`epi_slide`] details for more -#' explanation. If a function, `.f` must take an `epi_df` with the same -#' column names as the archive's `DT`, minus the `version` column; followed -#' by a one-row tibble containing the values of the grouping variables for -#' the associated group; followed by a reference time value, usually as a -#' `Date` object; followed by any number of named arguments. If a formula, -#' `.f` can operate directly on columns accessed via `.x$var` or `.$var`, as -#' in `~ mean (.x$var)` to compute a mean of a column `var` for each -#' group-`ref_time_value` combination. The group key can be accessed via -#' `.y` or `.group_key`, and the reference time value can be accessed via -#' `.z` or `.ref_time_value`. If `.f` is missing, then `...` will specify the +#' determined by the `.before` parameter (see details for more). If a +#' function, `.f` must have the form `function(x, g, t, ...)`, where +#' +#' - "x" is an epi_df with the same column names as the archive's `DT`, minus +#' the `version` column +#' - "g" is a one-row tibble containing the values of the grouping variables +#' for the associated group +#' - "t" is the ref_time_value for the current window +#' - "..." are additional arguments +#' +#' If a formula, `.f` can operate directly on columns accessed via `.x$var` or +#' `.$var`, as in `~ mean (.x$var)` to compute a mean of a column `var` for +#' each group-`ref_time_value` combination. The group key can be accessed via +#' `.y` or `.group_key`, and the reference time value can be accessed via `.z` +#' or `.ref_time_value`. If `.f` is missing, then `...` will specify the #' computation. #' @param ... Additional arguments to pass to the function or formula specified -#' via `f`. Alternatively, if `.f` is missing, then the `...` is interpreted as -#' a ["data-masking"][rlang::args_data_masking] expression or expressions for -#' tidy evaluation; in addition to referring columns directly by name, the +#' via `f`. Alternatively, if `.f` is missing, then the `...` is interpreted +#' as a ["data-masking"][rlang::args_data_masking] expression or expressions +#' for tidy evaluation; in addition to referring columns directly by name, the #' expressions have access to `.data` and `.env` pronouns as in `dplyr` verbs, -#' and can also refer to `.x`, `.group_key`, and `.ref_time_value`. See -#' details. +#' and can also refer to `.x` (not the same as the input epi_archive), +#' `.group_key`, and `.ref_time_value`. See details for more. #' @param .before How many time values before the `.ref_time_value` #' should each snapshot handed to the function `.f` contain? If provided, it #' should be a single value that is compatible with the time_type of the diff --git a/R/slide.R b/R/slide.R index 02e45329..40cd0fb4 100644 --- a/R/slide.R +++ b/R/slide.R @@ -8,15 +8,20 @@ #' @param .f Function, formula, or missing; together with `...` specifies the #' computation to slide. To "slide" means to apply a computation within a #' sliding (a.k.a. "rolling") time window for each data group. The window is -#' determined by the `before` and `after` parameters described below. One time -#' step is typically one day or one week; see details for more explanation. If -#' a function, `.f` must take a data frame with the same column names as the -#' original object, minus any grouping variables, containing the time window -#' data for one group-`.ref_time_value` combination; followed by a one-row -#' tibble containing the values of the grouping variables for the associated -#' group; followed by any number of named arguments. If a formula, `.f` can -#' operate directly on columns accessed via `.x$var` or `.$var`, as in -#' `~mean(.x$var)` to compute a mean of a column `var` for each +#' determined by the `.window_size` and `.align` parameters, see the details +#' section for more. If a function, `.f` must have the form `function(x, g, t, +#' ...)`, where +#' +#' - "x" is a data frame with the same column names as the original object, +#' minus any grouping variables, with only the windowed data for one +#' group-`.ref_time_value` combination +#' - "g" is a one-row tibble containing the values of the grouping variables +#' for the associated group +#' - "t" is the ref_time_value for the current window +#' - "..." are additional arguments +#' +#' If a formula, `.f` can operate directly on columns accessed via `.x$var` or +#' `.$var`, as in `~mean(.x$var)` to compute a mean of a column `var` for each #' `ref_time_value`-group combination. The group key can be accessed via `.y`. #' If `.f` is missing, then `...` will specify the computation. #' @param ... Additional arguments to pass to the function or formula specified @@ -24,8 +29,8 @@ #' as a ["data-masking"][rlang::args_data_masking] expression or expressions #' for tidy evaluation; in addition to referring columns directly by name, the #' expressions have access to `.data` and `.env` pronouns as in `dplyr` verbs, -#' and can also refer to `.x`, `.group_key`, and `.ref_time_value`. See -#' details. +#' and can also refer to `.x` (not the same as the input epi_df), +#' `.group_key`, and `.ref_time_value`. See details. #' @param .new_col_name String indicating the name of the new column that will #' contain the derivative values. Default is "slide_value"; note that setting #' `new_col_name` equal to an existing column name will overwrite this column. diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index fc675071..b507c13c 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -23,15 +23,20 @@ single data group.} \item{.f}{Function, formula, or missing; together with \code{...} specifies the computation to slide. To "slide" means to apply a computation within a sliding (a.k.a. "rolling") time window for each data group. The window is -determined by the \code{before} and \code{after} parameters described below. One time -step is typically one day or one week; see details for more explanation. If -a function, \code{.f} must take a data frame with the same column names as the -original object, minus any grouping variables, containing the time window -data for one group-\code{.ref_time_value} combination; followed by a one-row -tibble containing the values of the grouping variables for the associated -group; followed by any number of named arguments. If a formula, \code{.f} can -operate directly on columns accessed via \code{.x$var} or \code{.$var}, as in -\code{~mean(.x$var)} to compute a mean of a column \code{var} for each +determined by the \code{.window_size} and \code{.align} parameters, see the details +section for more. If a function, \code{.f} must have the form \verb{function(x, g, t, ...)}, where +\itemize{ +\item "x" is a data frame with the same column names as the original object, +minus any grouping variables, with only the windowed data for one +group-\code{.ref_time_value} combination +\item "g" is a one-row tibble containing the values of the grouping variables +for the associated group +\item "t" is the ref_time_value for the current window +\item "..." are additional arguments +} + +If a formula, \code{.f} can operate directly on columns accessed via \code{.x$var} or +\code{.$var}, as in \code{~mean(.x$var)} to compute a mean of a column \code{var} for each \code{ref_time_value}-group combination. The group key can be accessed via \code{.y}. If \code{.f} is missing, then \code{...} will specify the computation.} @@ -40,8 +45,8 @@ via \code{.f}. Alternatively, if \code{.f} is missing, then the \code{...} is in as a \link[rlang:args_data_masking]{"data-masking"} expression or expressions for tidy evaluation; in addition to referring columns directly by name, the expressions have access to \code{.data} and \code{.env} pronouns as in \code{dplyr} verbs, -and can also refer to \code{.x}, \code{.group_key}, and \code{.ref_time_value}. See -details.} +and can also refer to \code{.x} (not the same as the input epi_df), +\code{.group_key}, and \code{.ref_time_value}. See details.} \item{.window_size}{The size of the sliding window. By default, this is 1, meaning that only the current ref_time_value is included. The accepted values diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index d2f0c68f..40f00d11 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -43,27 +43,31 @@ all data in \code{x} will be treated as part of a single data group.} \item{.f}{Function, formula, or missing; together with \code{...} specifies the computation to slide. To "slide" means to apply a computation over a sliding (a.k.a. "rolling") time window for each data group. The window is -determined by the \code{before} parameter described below. One time step is -typically one day or one week; see \code{\link{epi_slide}} details for more -explanation. If a function, \code{.f} must take an \code{epi_df} with the same -column names as the archive's \code{DT}, minus the \code{version} column; followed -by a one-row tibble containing the values of the grouping variables for -the associated group; followed by a reference time value, usually as a -\code{Date} object; followed by any number of named arguments. If a formula, -\code{.f} can operate directly on columns accessed via \code{.x$var} or \code{.$var}, as -in \code{~ mean (.x$var)} to compute a mean of a column \code{var} for each -group-\code{ref_time_value} combination. The group key can be accessed via -\code{.y} or \code{.group_key}, and the reference time value can be accessed via -\code{.z} or \code{.ref_time_value}. If \code{.f} is missing, then \code{...} will specify the +determined by the \code{.before} parameter (see details for more). If a +function, \code{.f} must have the form \verb{function(x, g, t, ...)}, where +\itemize{ +\item "x" is an epi_df with the same column names as the archive's \code{DT}, minus +the \code{version} column +\item "g" is a one-row tibble containing the values of the grouping variables +for the associated group +\item "t" is the ref_time_value for the current window +\item "..." are additional arguments +} + +If a formula, \code{.f} can operate directly on columns accessed via \code{.x$var} or +\code{.$var}, as in \code{~ mean (.x$var)} to compute a mean of a column \code{var} for +each group-\code{ref_time_value} combination. The group key can be accessed via +\code{.y} or \code{.group_key}, and the reference time value can be accessed via \code{.z} +or \code{.ref_time_value}. If \code{.f} is missing, then \code{...} will specify the computation.} \item{...}{Additional arguments to pass to the function or formula specified -via \code{f}. Alternatively, if \code{.f} is missing, then the \code{...} is interpreted as -a \link[rlang:args_data_masking]{"data-masking"} expression or expressions for -tidy evaluation; in addition to referring columns directly by name, the +via \code{f}. Alternatively, if \code{.f} is missing, then the \code{...} is interpreted +as a \link[rlang:args_data_masking]{"data-masking"} expression or expressions +for tidy evaluation; in addition to referring columns directly by name, the expressions have access to \code{.data} and \code{.env} pronouns as in \code{dplyr} verbs, -and can also refer to \code{.x}, \code{.group_key}, and \code{.ref_time_value}. See -details.} +and can also refer to \code{.x} (not the same as the input epi_archive), +\code{.group_key}, and \code{.ref_time_value}. See details for more.} \item{.before}{How many time values before the \code{.ref_time_value} should each snapshot handed to the function \code{.f} contain? If provided, it From 2f91a90f6d14f5b6083ea25bdee31022115b9b7b Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 23 Aug 2024 17:19:18 -0700 Subject: [PATCH 058/110] doc: switch centre to center --- R/slide.R | 5 +++-- man/epi_slide.Rd | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/R/slide.R b/R/slide.R index 40cd0fb4..1128e453 100644 --- a/R/slide.R +++ b/R/slide.R @@ -59,14 +59,14 @@ #' dplyr::select(geo_value, time_value, cases, cases_7dav) %>% #' ungroup() #' -#' # slide a 7-day centre-aligned average +#' # slide a 7-day center-aligned average #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% #' epi_slide(cases_7dav = mean(cases), .window_size = 7, .align = "center") %>% #' dplyr::select(geo_value, time_value, cases, cases_7dav) %>% #' ungroup() #' -#' # slide a 14-day centre-aligned average +#' # slide a 14-day center-aligned average #' jhu_csse_daily_subset %>% #' group_by(geo_value) %>% #' epi_slide(cases_14dav = mean(cases), .window_size = 14, .align = "center") %>% @@ -118,6 +118,7 @@ epi_slide <- function( # Function body starts assert_class(.x, "epi_df") + assert_class(.x, "grouped_df") if (nrow(.x) == 0L) { return(.x) diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index b507c13c..23bb5217 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -189,14 +189,14 @@ jhu_csse_daily_subset \%>\% dplyr::select(geo_value, time_value, cases, cases_7dav) \%>\% ungroup() -# slide a 7-day centre-aligned average +# slide a 7-day center-aligned average jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% epi_slide(cases_7dav = mean(cases), .window_size = 7, .align = "center") \%>\% dplyr::select(geo_value, time_value, cases, cases_7dav) \%>\% ungroup() -# slide a 14-day centre-aligned average +# slide a 14-day center-aligned average jhu_csse_daily_subset \%>\% group_by(geo_value) \%>\% epi_slide(cases_14dav = mean(cases), .window_size = 14, .align = "center") \%>\% From 9f33e1b1572e9354ca85527d71d19a80f535132f Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 15:17:18 -0700 Subject: [PATCH 059/110] tests(assert_sufficient_f_args): test vs. mean, sum, slice; use expect_no* --- tests/testthat/test-utils.R | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index d18f9f48..b16c8ebe 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -77,10 +77,10 @@ test_that("assert_sufficient_f_args alerts if the provided f doesn't take enough f_xgt_dots <- function(x, g, t, ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) # If `regexp` is NA, asserts that there should be no errors/messages. - expect_error(assert_sufficient_f_args(f_xgt), regexp = NA) - expect_warning(assert_sufficient_f_args(f_xgt), regexp = NA) - expect_error(assert_sufficient_f_args(f_xgt_dots), regexp = NA) - expect_warning(assert_sufficient_f_args(f_xgt_dots), regexp = NA) + expect_no_error(assert_sufficient_f_args(f_xgt)) + expect_no_warning(assert_sufficient_f_args(f_xgt)) + expect_no_error(assert_sufficient_f_args(f_xgt_dots)) + expect_no_warning(assert_sufficient_f_args(f_xgt_dots)) f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) f_dots <- function(...) dplyr::tibble(value = c(5), count = c(2)) @@ -102,6 +102,21 @@ test_that("assert_sufficient_f_args alerts if the provided f doesn't take enough class = "epiprocess__assert_sufficient_f_args__f_needs_min_args" ) + # Make sure we generate the same sort of conditions on some external functions + # that have caused surprises in the past: + expect_warning(assert_sufficient_f_args(mean), + regexp = ", the group key and reference time value will be included", + class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" + ) + expect_warning(assert_sufficient_f_args(sum), + regexp = ", the window data, group key, and reference time value will be included", + class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" + ) + expect_warning(assert_sufficient_f_args(dplyr::slice), + regexp = ", the group key and reference time value will be included", + class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" + ) + f_xs_dots <- function(x, setting = "a", ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) f_xs <- function(x, setting = "a") dplyr::tibble(value = mean(x$binary), count = length(x$binary)) expect_warning(assert_sufficient_f_args(f_xs_dots, setting = "b"), From 14cd7363f35ecf258eaebb3322293f89f132b071 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 1 Aug 2024 18:46:17 -0700 Subject: [PATCH 060/110] BREAKING CHANGE(epix_slide): output `version` column, other re/dual-names In `epix_slide()`: - warn-deprecate `.ref_time_values =` in favor of `.versions =` - allow tidyeval or formula comps to use `.ref_time_value` or `.version` to access the ref_time_value/version (currently, these two things are always the same) - output a `version` column, not a `time_value` column - rename `epix_slide_ref_time_values_default` -> `epix_slide_versions_default` - some other cleanup from a rebase combining with dot-prefixing and other slide changes --- NAMESPACE | 2 + R/grouped_epi_archive.R | 38 ++++---- R/methods-epi_archive.R | 8 +- R/slide.R | 2 +- R/utils.R | 82 +++++++++++++---- man-roxygen/ref-time-value-label.R | 2 + man/epix_slide.Rd | 22 ++--- tests/testthat/test-epix_slide.R | 102 +++++++++++----------- tests/testthat/test-grouped_epi_archive.R | 8 +- tests/testthat/test-utils.R | 70 +++++++-------- 10 files changed, 197 insertions(+), 139 deletions(-) create mode 100644 man-roxygen/ref-time-value-label.R diff --git a/NAMESPACE b/NAMESPACE index fc6aaf74..fa4f76df 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -48,8 +48,10 @@ export("%>%") export(archive_cases_dv_subset) export(arrange) export(arrange_canonical) +export(as_diagonal_slide_computation) export(as_epi_archive) export(as_epi_df) +export(as_time_slide_computation) export(as_tsibble) export(autoplot) export(clone) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 9e9279fc..d97d7307 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -209,14 +209,16 @@ epix_slide.grouped_epi_archive <- function( .f, ..., .before = Inf, - .ref_time_values = NULL, + .versions = NULL, .new_col_name = NULL, .all_versions = FALSE) { - # Deprecated argument handling + + # Perform some deprecated argument checks without using ` = + # deprecated()` in the function signature, because they are from + # early development versions and much more likely to be clutter than + # informative in the signature. provided_args <- rlang::call_args_names(rlang::call_match()) - if (any(purrr::map_lgl( - provided_args, ~ .x %in% c("x", "f", "before", "ref_time_values", "new_col_name", "all_versions") - ))) { + if (any(provided_args %in% c("x", "f", "before", "ref_time_values", "new_col_name", "all_versions", "group_by"))) { cli::cli_abort( "epix_slide: you are using one of the following old argument names: `x`, `f`, `before`, `ref_time_values`, `new_col_name`, `all_versions`. Please use the new names: `.x`, `.f`, `.before`, `.ref_time_values`, @@ -255,19 +257,21 @@ epix_slide.grouped_epi_archive <- function( } # Argument validation - if (is.null(.ref_time_values)) { - ref_time_values <- epix_slide_ref_time_values_default(.x$private$ungrouped) + if (is.null(.versions)) { + .versions <- epix_slide_versions_default(.x$private$ungrouped) } else { - assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) - if (any(.ref_time_values > .x$private$ungrouped$versions_end)) { - cli_abort("Some `ref_time_values` are greater than the latest version in the archive.") + assert_numeric(.versions, min.len = 1L, null.ok = FALSE, any.missing = FALSE) + if (any(.versions > .x$private$ungrouped$versions_end)) { + cli_abort("All `.versions` must be less than or equal to the latest version in the archive.") } - if (anyDuplicated(.ref_time_values) != 0L) { - cli_abort("Some `ref_time_values` are duplicated.") + if (anyDuplicated(.versions) != 0L) { + cli_abort("All `.versions` must be unique.") } # Sort, for consistency with `epi_slide`, although the current # implementation doesn't take advantage of it. - ref_time_values <- sort(.ref_time_values) + .versions <- sort(.versions) + ref_time_values <- sort(ref_time_values) + .versions <- sort(.versions) } validate_slide_window_arg(.before, .x$private$ungrouped$time_type) @@ -287,14 +291,14 @@ epix_slide.grouped_epi_archive <- function( cli_abort("If `f` is missing then a computation must be specified via `...`.") } - f <- as_slide_computation(quosures) + f <- as_diagonal_slide_computation(quosures) # Magic value that passes zero args as dots in calls below. Equivalent to # `... <- missing_arg()`, but use `assign` to avoid warning about # improper use of dots. assign("...", missing_arg()) } else { used_data_masking <- FALSE - f <- as_slide_computation(.f, ...) + f <- as_diagonal_slide_computation(.f, ...) } # Computation for one group, one time value @@ -326,7 +330,7 @@ epix_slide.grouped_epi_archive <- function( # redundant work. `group_modify()` provides the group key, we provide the # ref time value (appropriately recycled) and comp_value (appropriately # named / unpacked, for quick feedback) - res <- list(time_value = vctrs::vec_rep(ref_time_value, vctrs::vec_size(comp_value))) + res <- list(version = vctrs::vec_rep(ref_time_value, vctrs::vec_size(comp_value))) if (is.null(new_col_name)) { if (inherits(comp_value, "data.frame")) { @@ -350,7 +354,7 @@ epix_slide.grouped_epi_archive <- function( return(validate_tibble(new_tibble(res))) } - out <- lapply(ref_time_values, function(ref_time_value) { + out <- lapply(versions, function(ref_time_value) { # Ungrouped as-of data; `epi_df` if `all_versions` is `FALSE`, # `epi_archive` if `all_versions` is `TRUE`: as_of_raw <- .x$private$ungrouped %>% epix_as_of( diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index c89ed61c..169e9270 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -802,7 +802,7 @@ epix_slide <- function( .f, ..., .before = Inf, - .ref_time_values = NULL, + .versions = NULL, .new_col_name = NULL, .all_versions = FALSE) { UseMethod("epix_slide") @@ -816,7 +816,7 @@ epix_slide.epi_archive <- function( .f, ..., .before = Inf, - .ref_time_values = NULL, + .versions = NULL, .new_col_name = NULL, .all_versions = FALSE) { # For an "ungrouped" slide, treat all rows as belonging to one big @@ -826,7 +826,7 @@ epix_slide.epi_archive <- function( group_by(.x), .f, ..., - .before = .before, .ref_time_values = .ref_time_values, + .before = .before, .versions = .versions, .new_col_name = .new_col_name, .all_versions = .all_versions ) %>% # We want a slide on ungrouped archives to output something @@ -841,7 +841,7 @@ epix_slide.epi_archive <- function( #' Default value for `ref_time_values` in an `epix_slide` #' #' @noRd -epix_slide_ref_time_values_default <- function(ea) { +epix_slide_versions_default <- function(ea) { versions_with_updates <- c(ea$DT$version, ea$versions_end) ref_time_values <- tidyr::full_seq(versions_with_updates, guess_period(versions_with_updates)) return(ref_time_values) diff --git a/R/slide.R b/R/slide.R index 02e45329..a9f3a86c 100644 --- a/R/slide.R +++ b/R/slide.R @@ -193,7 +193,7 @@ epi_slide <- function( used_data_masking <- FALSE } - f <- as_slide_computation(.f, ...) + f <- as_time_slide_computation(.f, ...) # Create a wrapper that calculates and passes `.ref_time_value` to the # computation. `i` is contained in the `f_wrapper_factory` environment such diff --git a/R/utils.R b/R/utils.R index 9c47594d..c585abec 100644 --- a/R/utils.R +++ b/R/utils.R @@ -89,21 +89,21 @@ paste_lines <- function(lines) { paste(paste0(lines, "\n"), collapse = "") } - #' Assert that a sliding computation function takes enough args #' #' @param f Function; specifies a computation to slide over an `epi_df` or -#' `epi_archive` in `epi_slide` or `epix_slide`. +#' `epi_archive` in `epi_slide` or `epix_slide`. #' @param ... Dots that will be forwarded to `f` from the dots of `epi_slide` or #' `epix_slide`. +#' @template ref-time-value-label #' #' @importFrom rlang is_missing #' @importFrom purrr map_lgl #' @importFrom utils tail #' #' @noRd -assert_sufficient_f_args <- function(f, ...) { - mandatory_f_args_labels <- c("window data", "group key", "reference time value") +assert_sufficient_f_args <- function(f, ..., .ref_time_value_label) { + mandatory_f_args_labels <- c("window data", "group key", .ref_time_value_label) n_mandatory_f_args <- length(mandatory_f_args_labels) args <- formals(args(f)) args_names <- names(args) @@ -265,21 +265,42 @@ assert_sufficient_f_args <- function(f, ...) { #' @param ... Additional arguments to pass to the function or formula #' specified via `x`. If `x` is a quosure, any arguments passed via `...` #' will be ignored. +#' +#' @param .ref_time_value_long_varnames `r lifecycle::badge("experimental")` +#' Character vector. What variable names should we allow formulas and +#' data-masking tidy evaluation to use to refer to `ref_time_value` for the +#' computation (in addition to `.z` in formulas)? E.g., `".ref_time_value"` or +#' `c(".ref_time_value", ".version")`. +#' +#' @template ref-time-value-label +#' #' @examples -#' f <- as_slide_computation(~ .x + 1) -#' f(10) +#' f1 <- as_slide_computation(~ .z - .x$time_value, +#' .ref_time_value_long_varnames = character(0L), +#' .ref_time_value_label = "third argument" +#' ) +#' f1(tibble::tibble(time_value = 10), tibble::tibble(), 12) +#' +#' f2 <- as_time_slide_computation(~ .ref_time_value - .x$time_value) +#' f2(tibble::tibble(time_value = 10), tibble::tibble(), 12) #' -#' g <- as_slide_computation(~ -1 * .) +#' f3 <- as_diagonal_slide_computation(~ .version - .x$time_value) +#' f3(tibble::tibble(time_value = 10), tibble::tibble(), 12) +#' +#' f4 <- as_diagonal_slide_computation(~ .ref_time_value - .x$time_value) +#' f4(tibble::tibble(time_value = 10), tibble::tibble(), 12) +#' +#' g <- as_time_slide_computation(~ -1 * .) #' g(4) #' -#' h <- as_slide_computation(~ .x - .group_key) +#' h <- as_time_slide_computation(~ .x - .group_key) #' h(6, 3) #' #' @importFrom rlang is_function new_function f_env is_environment missing_arg #' f_rhs is_formula caller_arg caller_env #' #' @noRd -as_slide_computation <- function(f, ...) { +as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_time_value_label) { arg <- caller_arg(f) call <- caller_env() @@ -301,7 +322,9 @@ as_slide_computation <- function(f, ...) { # through the quosures. data_mask$.x <- .x data_mask$.group_key <- .group_key - data_mask$.ref_time_value <- .ref_time_value + for (ref_time_value_long_varname in .ref_time_value_long_varnames) { + data_mask[[ref_time_value_long_varname]] <- .ref_time_value + } common_size <- NULL # The data mask is an environment; it doesn't track the binding order. # We'll track that separately. For efficiency, we'll use `c` to add to @@ -373,7 +396,7 @@ as_slide_computation <- function(f, ...) { if (is_function(f)) { # Check that `f` takes enough args - assert_sufficient_f_args(f, ...) + assert_sufficient_f_args(f, ..., .ref_time_value_label = .ref_time_value_label) return(f) } @@ -410,13 +433,19 @@ as_slide_computation <- function(f, ...) { ) } - args <- list( - ... = missing_arg(), - .x = quote(..1), .y = quote(..2), .z = quote(..3), - . = quote(..1), .group_key = quote(..2), .ref_time_value = quote(..3) + args <- c( + list( + ... = missing_arg(), + .x = quote(..1), .y = quote(..2), .z = quote(..3), + . = quote(..1), .group_key = quote(..2) + ), + `names<-`( + rep(list(quote(..3)), length(.ref_time_value_long_varnames)), + .ref_time_value_long_varnames + ) ) fn <- new_function(args, f_rhs(f), env) - fn <- structure(fn, class = c("epiprocess_slide_computation", "function")) + fn <- structure(fn, class = c("epiprocess_formula_slide_computation", "function")) return(fn) } @@ -432,6 +461,27 @@ as_slide_computation <- function(f, ...) { ) } +#' @rdname as_slide_computation +#' @export +#' @noRd +as_time_slide_computation <- function(f, ...) { + as_slide_computation( + f, ..., + .ref_time_value_long_varnames = ".ref_time_value", + .ref_time_value_label = "reference time value" + ) +} + +#' @rdname as_slide_computation +#' @export +#' @noRd +as_diagonal_slide_computation <- function(f, ...) { + as_slide_computation( + f, ..., + .ref_time_value_long_varnames = c(".version", ".ref_time_value"), + .ref_time_value_label = "version" + ) +} guess_geo_type <- function(geo_value) { if (is.character(geo_value)) { diff --git a/man-roxygen/ref-time-value-label.R b/man-roxygen/ref-time-value-label.R new file mode 100644 index 00000000..c81615b9 --- /dev/null +++ b/man-roxygen/ref-time-value-label.R @@ -0,0 +1,2 @@ +#' @param .ref_time_value_label String; how to describe/label the `ref_time_value` in +#' error messages; e.g., "reference time value" or "version". diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index d2f0c68f..75a99994 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -11,7 +11,7 @@ epix_slide( .f, ..., .before = Inf, - .ref_time_values = NULL, + .versions = NULL, .new_col_name = NULL, .all_versions = FALSE ) @@ -21,7 +21,7 @@ epix_slide( .f, ..., .before = Inf, - .ref_time_values = NULL, + .versions = NULL, .new_col_name = NULL, .all_versions = FALSE ) @@ -31,7 +31,7 @@ epix_slide( .f, ..., .before = Inf, - .ref_time_values = NULL, + .versions = NULL, .new_col_name = NULL, .all_versions = FALSE ) @@ -74,14 +74,6 @@ in the archive is "day", and the \code{.ref_time_value} is January 8, then the smallest time_value in the snapshot will be January 1. If missing, then the default is no limit on the time values, so the full snapshot is given.} -\item{.ref_time_values}{Reference time values / versions for sliding -computations; each element of this vector serves both as the anchor point -for the \code{time_value} window for the computation and the \code{max_version} -\code{epix_as_of} which we fetch data in this window. If missing, then this will -set to a regularly-spaced sequence of values set to cover the range of -\code{version}s in the \code{DT} plus the \code{versions_end}; the spacing of values will -be guessed (using the GCD of the skips between values).} - \item{.new_col_name}{String indicating the name of the new column that will contain the derivative values. The default is "slide_value" unless your slide computations output data frames, in which case they will be unpacked @@ -94,6 +86,14 @@ TRUE, then \code{.f} will be passed the version history (all \code{.ref_time_value - before} and \code{.ref_time_value}. Otherwise, \code{.f} will be passed only the most recent \code{version} for every unique \code{time_value}. Default is \code{FALSE}.} + +\item{.ref_time_values}{Reference time values / versions for sliding +computations; each element of this vector serves both as the anchor point +for the \code{time_value} window for the computation and the \code{max_version} +\code{epix_as_of} which we fetch data in this window. If missing, then this will +set to a regularly-spaced sequence of values set to cover the range of +\code{version}s in the \code{DT} plus the \code{versions_end}; the spacing of values will +be guessed (using the GCD of the skips between values).} } \value{ A tibble whose columns are: the grouping variables, \code{time_value}, diff --git a/tests/testthat/test-epix_slide.R b/tests/testthat/test-epix_slide.R index 87edfdb5..179d9427 100644 --- a/tests/testthat/test-epix_slide.R +++ b/tests/testthat/test-epix_slide.R @@ -13,7 +13,7 @@ x <- tibble::tribble( test_date + 6, test_date + c(1:2, 4:5), 2^(7:10), test_date + 7, test_date + 2:6, 2^(11:15) ) %>% - tidyr::unnest(c(time_value, binary)) + tidyr::unchop(c(time_value, binary)) xx <- bind_cols(geo_value = rep("ak", 15), x) %>% as_epi_archive() @@ -29,7 +29,7 @@ test_that("epix_slide works as intended", { xx2 <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), sum_binary = c( 2^3 + 2^2, 2^6 + 2^3, @@ -80,7 +80,7 @@ test_that("epix_slide works as intended with list cols", { ) xx_dfrow2 <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), slide_value = c( 2^3 + 2^2, @@ -108,7 +108,7 @@ test_that("epix_slide works as intended with list cols", { ) xx_df2 <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), slide_value = list( c(2^3, 2^2), @@ -128,7 +128,7 @@ test_that("epix_slide works as intended with list cols", { ) xx_scalar2 <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), slide_value = list( 2^3 + 2^2, @@ -148,7 +148,7 @@ test_that("epix_slide works as intended with list cols", { ) xx_vec2 <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), slide_value = list( c(2^3, 2^2), @@ -182,7 +182,7 @@ test_that("epix_slide `.before` validation works", { test_that("quosure passing issue in epix_slide is resolved + other potential issues", { # (First part adapted from @examples) - time_values <- seq(as.Date("2020-06-01"), + versions <- seq(as.Date("2020-06-01"), as.Date("2020-06-02"), by = "1 day" ) @@ -200,7 +200,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ) reference_by_neither <- ea %>% @@ -208,7 +208,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ) # test the passing-something-that-must-be-enquosed behavior: @@ -220,7 +220,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_modulus @@ -231,7 +231,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss .x = ea %>% group_by(.data$modulus), .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_modulus @@ -242,7 +242,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_modulus @@ -253,7 +253,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss .x = ea %>% group_by(dplyr::across(all_of("modulus"))), .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_modulus @@ -264,7 +264,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_modulus @@ -276,7 +276,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss .x = ea %>% group_by(dplyr::across(tidyselect::all_of(my_group_by))), .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_modulus @@ -287,7 +287,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_modulus @@ -298,7 +298,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss .x = ea, .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_neither @@ -307,7 +307,7 @@ test_that("quosure passing issue in epix_slide is resolved + other potential iss ea %>% epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = time_values, + .versions = versions, .new_col_name = "case_rate_3d_av" ), reference_by_neither @@ -323,7 +323,7 @@ ea <- tibble::tribble( test_date + 6, test_date + 1:5, 2^(5:1), test_date + 7, test_date + 1:6, 2^(6:1) ) %>% - tidyr::unnest(c(time_value, binary)) %>% + tidyr::unchop(c(time_value, binary)) %>% mutate(geo_value = "ak") %>% as_epi_archive() @@ -350,7 +350,7 @@ test_that("epix_slide with .all_versions option has access to all older versions expect_true(inherits(result1, "tbl_df")) result2 <- tibble::tribble( - ~time_value, ~n_versions, ~n_row, ~dt_class1, ~dt_key, + ~version, ~n_versions, ~n_row, ~dt_class1, ~dt_key, test_date + 2, 1L, sum(1:1), "data.table", key(ea$DT), test_date + 3, 2L, sum(1:2), "data.table", key(ea$DT), test_date + 4, 3L, sum(1:3), "data.table", key(ea$DT), @@ -388,7 +388,7 @@ test_that("epix_slide with .all_versions option has access to all older versions epix_slide( # unfortunately, we can't pass this directly as `f` and need an extra comma , - slide_fn(.x, .group_key, .ref_time_value), + slide_fn(.x, .group_key, .version), .before = 10^3, .all_versions = TRUE ) @@ -404,14 +404,14 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { diff_mean = mean(diff(x$binary)) ) } - ref_time_value1 <- test_date + version1 <- test_date expect_identical( - ea %>% epix_as_of(ref_time_value1) %>% f1() %>% mutate(time_value = ref_time_value1, .before = 1L), + ea %>% epix_as_of(version1) %>% f1() %>% mutate(version = version1, .before = 1L), ea %>% epix_slide( f1, .before = 1000, - .ref_time_values = ref_time_value1 + .versions = version1 ) ) @@ -420,11 +420,11 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { x %>% # extract time&version-lag-1 data: epix_slide( - function(subx, subgk, rtv) { + function(subx, subgk, version) { tibble(data = list( subx %>% - filter(time_value == attr(subx, "metadata")$as_of - 1) %>% - rename(real_time_value = time_value, lag1 = binary) + filter(time_value == version - 1) %>% + rename(lag1 = binary) )) }, .before = 1 @@ -437,17 +437,17 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { ) %>% summarize(mean_abs_delta = mean(abs(binary - lag1))) } - ref_time_value2 <- test_date + 5 + version2 <- test_date + 5 expect_identical( ea %>% - epix_as_of(ref_time_value2, all_versions = TRUE) %>% + epix_as_of(version2, all_versions = TRUE) %>% f2() %>% - mutate(time_value = ref_time_value2, .before = 1L), + mutate(version = version2, .before = 1L), ea %>% epix_slide( f2, .before = 1000, - .ref_time_values = ref_time_value2, + .versions = version2, .all_versions = TRUE ) ) @@ -466,14 +466,14 @@ test_that("epix_as_of and epix_slide with long enough window are compatible", { epix_slide( f2, .before = 1000, - .ref_time_values = ref_time_value2, + .versions = version2, .all_versions = TRUE ) %>% filter(geo_value == "ak"), ea %>% # using `ea` here is like filtering `ea_multigeo` to `geo_value=="x"` - epix_as_of(ref_time_value2, all_versions = TRUE) %>% + epix_as_of(version2, all_versions = TRUE) %>% f2() %>% - transmute(geo_value = "ak", time_value = ref_time_value2, mean_abs_delta) %>% + transmute(geo_value = "ak", version = version2, mean_abs_delta) %>% group_by(geo_value) ) }) @@ -489,7 +489,7 @@ test_that("epix_slide `f` is passed an ungrouped `epi_archive` when `.all_versio epix_slide( .f = slide_fn, .before = 1, - .ref_time_values = test_date + 5, + .versions = test_date + 5, .new_col_name = "out", .all_versions = TRUE ) @@ -507,7 +507,7 @@ test_that("epix_slide with .all_versions option works as intended", { xx2 <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), sum_binary = c( 2^3 + 2^2, 2^6 + 2^3, @@ -564,7 +564,7 @@ test_that("epix_slide works with 0-row computation outputs", { ea %>% epix_slide_empty(), tibble::tibble( - time_value = ea$DT$version[integer(0)] + version = ea$DT$version[integer(0)] ) ) expect_identical( @@ -573,7 +573,7 @@ test_that("epix_slide works with 0-row computation outputs", { epix_slide_empty(), tibble::tibble( geo_value = ea$DT$geo_value[integer(0)], - time_value = ea$DT$version[integer(0)] + version = ea$DT$version[integer(0)] ) %>% group_by(geo_value) ) @@ -583,7 +583,7 @@ test_that("epix_slide works with 0-row computation outputs", { ea %>% epix_slide_empty(.all_versions = TRUE), tibble::tibble( - time_value = ea$DT$version[integer(0)] + version = ea$DT$version[integer(0)] ) ) expect_identical( @@ -592,7 +592,7 @@ test_that("epix_slide works with 0-row computation outputs", { epix_slide_empty(.all_versions = TRUE), tibble::tibble( geo_value = ea$DT$geo_value[integer(0)], - time_value = ea$DT$version[integer(0)] + version = ea$DT$version[integer(0)] ) %>% group_by(geo_value) ) @@ -610,10 +610,10 @@ test_that("epix_slide alerts if the provided f doesn't take enough args", { ) }) -test_that("epix_slide computation via formula can use ref_time_value", { +test_that("epix_slide computation via formula can use version", { xx_ref <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), slide_value = test_date + c(4, 5, 6, 7) ) %>% group_by(geo_value) @@ -621,7 +621,7 @@ test_that("epix_slide computation via formula can use ref_time_value", { xx1 <- xx %>% group_by(.data$geo_value) %>% epix_slide( - .f = ~.ref_time_value, + .f = ~.version, .before = 2 ) @@ -646,10 +646,10 @@ test_that("epix_slide computation via formula can use ref_time_value", { expect_identical(xx3, xx_ref) }) -test_that("epix_slide computation via function can use ref_time_value", { +test_that("epix_slide computation via function can use version", { xx_ref <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), slide_value = test_date + c(4, 5, 6, 7) ) %>% group_by(geo_value) @@ -664,11 +664,11 @@ test_that("epix_slide computation via function can use ref_time_value", { expect_identical(xx1, xx_ref) }) -test_that("epix_slide computation via dots can use ref_time_value and group", { - # ref_time_value +test_that("epix_slide computation via dots can use version and group", { + # version xx_ref <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), slide_value = test_date + c(4, 5, 6, 7) ) %>% group_by(geo_value) @@ -677,7 +677,7 @@ test_that("epix_slide computation via dots can use ref_time_value and group", { group_by(.data$geo_value) %>% epix_slide( .before = 2, - slide_value = .ref_time_value + slide_value = .version ) expect_identical(xx1, xx_ref) @@ -685,7 +685,7 @@ test_that("epix_slide computation via dots can use ref_time_value and group", { # group_key xx_ref <- tibble( geo_value = rep("ak", 4), - time_value = test_date + c(4, 5, 6, 7), + version = test_date + c(4, 5, 6, 7), slide_value = "ak" ) %>% group_by(geo_value) @@ -752,7 +752,7 @@ test_that("`epix_slide` doesn't decay date output", { test_that("`epix_slide` can access objects inside of helper functions", { helper <- function(archive_haystack, time_value_needle) { - archive_haystack %>% epix_slide(has_needle = time_value_needle %in% time_value, .before = Inf) + archive_haystack %>% epix_slide(has_needle = time_value_needle %in% time_value) } expect_no_error(helper(archive_cases_dv_subset, as.Date("2021-01-01"))) expect_no_error(helper(xx, 3L)) diff --git a/tests/testthat/test-grouped_epi_archive.R b/tests/testthat/test-grouped_epi_archive.R index 388ed614..1e953d6f 100644 --- a/tests/testthat/test-grouped_epi_archive.R +++ b/tests/testthat/test-grouped_epi_archive.R @@ -52,7 +52,7 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { grouped_factor_then_nonfactor %>% epix_slide(.before = 10, s = sum(value)), tibble::tribble( - ~age_group, ~geo_value, ~time_value, ~s, + ~age_group, ~geo_value, ~version, ~s, "pediatric", NA_character_, "2000-01-02", 0, "adult", "us", "2000-01-02", 121, "pediatric", "us", "2000-01-03", 5, @@ -60,7 +60,7 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { ) %>% mutate( age_group = ordered(age_group, c("pediatric", "adult")), - time_value = as.Date(time_value) + version = as.Date(version) ) %>% group_by(age_group, geo_value, .drop = FALSE) ) @@ -69,7 +69,7 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { group_by(geo_value, age_group, .drop = FALSE) %>% epix_slide(.before = 10, s = sum(value)), tibble::tribble( - ~geo_value, ~age_group, ~time_value, ~s, + ~geo_value, ~age_group, ~version, ~s, "us", "pediatric", "2000-01-02", 0, "us", "adult", "2000-01-02", 121, "us", "pediatric", "2000-01-03", 5, @@ -77,7 +77,7 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { ) %>% mutate( age_group = ordered(age_group, c("pediatric", "adult")), - time_value = as.Date(time_value) + version = as.Date(version) ) %>% # as_epi_df(as_of = as.Date("2000-01-03"), # other_keys = "age_group") %>% diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index b16c8ebe..b84c1e4a 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -77,56 +77,56 @@ test_that("assert_sufficient_f_args alerts if the provided f doesn't take enough f_xgt_dots <- function(x, g, t, ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) # If `regexp` is NA, asserts that there should be no errors/messages. - expect_no_error(assert_sufficient_f_args(f_xgt)) - expect_no_warning(assert_sufficient_f_args(f_xgt)) - expect_no_error(assert_sufficient_f_args(f_xgt_dots)) - expect_no_warning(assert_sufficient_f_args(f_xgt_dots)) + expect_no_error(assert_sufficient_f_args(f_xgt, .ref_time_value_label = "reference time value")) + expect_no_warning(assert_sufficient_f_args(f_xgt, .ref_time_value_label = "reference time value")) + expect_no_error(assert_sufficient_f_args(f_xgt_dots, .ref_time_value_label = "reference time value")) + expect_no_warning(assert_sufficient_f_args(f_xgt_dots, .ref_time_value_label = "reference time value")) f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) f_dots <- function(...) dplyr::tibble(value = c(5), count = c(2)) f_x <- function(x) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) f <- function() dplyr::tibble(value = c(5), count = c(2)) - expect_warning(assert_sufficient_f_args(f_x_dots), + expect_warning(assert_sufficient_f_args(f_x_dots, .ref_time_value_label = "reference time value"), regexp = ", the group key and reference time value will be included", class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) - expect_warning(assert_sufficient_f_args(f_dots), + expect_warning(assert_sufficient_f_args(f_dots, .ref_time_value_label = "reference time value"), regexp = ", the window data, group key, and reference time value will be included", class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) - expect_error(assert_sufficient_f_args(f_x), + expect_error(assert_sufficient_f_args(f_x, .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__f_needs_min_args" ) - expect_error(assert_sufficient_f_args(f), + expect_error(assert_sufficient_f_args(f, .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__f_needs_min_args" ) # Make sure we generate the same sort of conditions on some external functions # that have caused surprises in the past: - expect_warning(assert_sufficient_f_args(mean), + expect_warning(assert_sufficient_f_args(mean, .ref_time_value_label = "reference time value"), regexp = ", the group key and reference time value will be included", class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) - expect_warning(assert_sufficient_f_args(sum), + expect_warning(assert_sufficient_f_args(sum, .ref_time_value_label = "reference time value"), regexp = ", the window data, group key, and reference time value will be included", class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) - expect_warning(assert_sufficient_f_args(dplyr::slice), + expect_warning(assert_sufficient_f_args(dplyr::slice, .ref_time_value_label = "reference time value"), regexp = ", the group key and reference time value will be included", class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) f_xs_dots <- function(x, setting = "a", ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) f_xs <- function(x, setting = "a") dplyr::tibble(value = mean(x$binary), count = length(x$binary)) - expect_warning(assert_sufficient_f_args(f_xs_dots, setting = "b"), + expect_warning(assert_sufficient_f_args(f_xs_dots, setting = "b", .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) - expect_error(assert_sufficient_f_args(f_xs, setting = "b"), + expect_error(assert_sufficient_f_args(f_xs, setting = "b", .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__f_needs_min_args_plus_forwarded" ) - expect_error(assert_sufficient_f_args(f_xgt, "b"), + expect_error(assert_sufficient_f_args(f_xgt, "b", .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__f_needs_min_args_plus_forwarded" ) }) @@ -136,15 +136,15 @@ test_that("assert_sufficient_f_args alerts if the provided f has defaults for th f_xgt_dots <- function(x = 1, g, t, ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) f_x_dots <- function(x = 1, ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) - expect_error(assert_sufficient_f_args(f_xgt), + expect_error(assert_sufficient_f_args(f_xgt, .ref_time_value_label = "reference time value"), regexp = "pass the group key to `f`'s g argument,", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) - expect_error(assert_sufficient_f_args(f_xgt_dots), + expect_error(assert_sufficient_f_args(f_xgt_dots, .ref_time_value_label = "reference time value"), regexp = "pass the window data to `f`'s x argument,", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) - expect_error(suppressWarnings(assert_sufficient_f_args(f_x_dots)), + expect_error(suppressWarnings(assert_sufficient_f_args(f_x_dots, .ref_time_value_label = "reference time value")), class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) @@ -153,23 +153,23 @@ test_that("assert_sufficient_f_args alerts if the provided f has defaults for th f_xs_dots <- function(x = 1, setting = "a", ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) # forwarding named dots should prevent some complaints: - expect_no_error(assert_sufficient_f_args(f_xsgt, setting = "b")) - expect_no_error(assert_sufficient_f_args(f_xsgt_dots, setting = "b")) - expect_error(suppressWarnings(assert_sufficient_f_args(f_xs_dots, setting = "b")), + expect_no_error(assert_sufficient_f_args(f_xsgt, setting = "b", .ref_time_value_label = "reference time value")) + expect_no_error(assert_sufficient_f_args(f_xsgt_dots, setting = "b", .ref_time_value_label = "reference time value")) + expect_error(suppressWarnings(assert_sufficient_f_args(f_xs_dots, setting = "b", .ref_time_value_label = "reference time value")), regexp = "pass the window data to `f`'s x argument", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) # forwarding unnamed dots should not: - expect_error(assert_sufficient_f_args(f_xsgt, "b"), + expect_error(assert_sufficient_f_args(f_xsgt, "b", .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) - expect_error(assert_sufficient_f_args(f_xsgt_dots, "b"), + expect_error(assert_sufficient_f_args(f_xsgt_dots, "b", .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) expect_error( expect_warning( - assert_sufficient_f_args(f_xs_dots, "b"), + assert_sufficient_f_args(f_xs_dots, "b", .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ), class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" @@ -178,7 +178,7 @@ test_that("assert_sufficient_f_args alerts if the provided f has defaults for th # forwarding no dots should produce a different error message in some cases: expect_error( expect_warning( - assert_sufficient_f_args(f_xs_dots), + assert_sufficient_f_args(f_xs_dots, .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ), regexp = "window data and group key to `f`'s x and setting argument", @@ -188,43 +188,43 @@ test_that("assert_sufficient_f_args alerts if the provided f has defaults for th test_that("computation formula-derived functions take all argument types", { # positional - expect_identical(as_slide_computation(~ ..2 + ..3)(1, 2, 3), 5) - expect_identical(as_slide_computation(~..1)(1, 2, 3), 1) + expect_identical(as_time_slide_computation(~ ..2 + ..3)(1, 2, 3), 5) + expect_identical(as_time_slide_computation(~..1)(1, 2, 3), 1) # Matching rlang, purr, dplyr usage - expect_identical(as_slide_computation(~ .x + .z)(1, 2, 3), 4) - expect_identical(as_slide_computation(~ .x + .y)(1, 2, 3), 3) + expect_identical(as_time_slide_computation(~ .x + .z)(1, 2, 3), 4) + expect_identical(as_time_slide_computation(~ .x + .y)(1, 2, 3), 3) # named - expect_identical(as_slide_computation(~ . + .ref_time_value)(1, 2, 3), 4) - expect_identical(as_slide_computation(~.group_key)(1, 2, 3), 2) + expect_identical(as_time_slide_computation(~ . + .ref_time_value)(1, 2, 3), 4) + expect_identical(as_time_slide_computation(~.group_key)(1, 2, 3), 2) }) test_that("as_slide_computation passes functions unaltered", { f <- function(a, b, c) { a * b * c + 5 } - expect_identical(as_slide_computation(f), f) + expect_identical(as_time_slide_computation(f), f) }) test_that("as_slide_computation raises errors as expected", { # Formulas must be one-sided - expect_error(as_slide_computation(y ~ ..1), + expect_error(as_time_slide_computation(y ~ ..1), class = "epiprocess__as_slide_computation__formula_is_twosided" ) # Formulas can't be paired with ... - expect_error(as_slide_computation(~..1, method = "fn"), + expect_error(as_time_slide_computation(~..1, method = "fn"), class = "epiprocess__as_slide_computation__formula_with_dots" ) # `f_env` must be an environment formula_without_env <- stats::as.formula(~..1) rlang::f_env(formula_without_env) <- 5 - expect_error(as_slide_computation(formula_without_env), + expect_error(as_time_slide_computation(formula_without_env), class = "epiprocess__as_slide_computation__formula_has_no_env" ) # `f` must be a function, formula, or string - expect_error(as_slide_computation(5), + expect_error(as_time_slide_computation(5), class = "epiprocess__as_slide_computation__cant_convert_catchall" ) }) From 3110a7fe0b585b40848ff1cbf3a69d57b1a0a1df Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 5 Aug 2024 17:19:35 -0700 Subject: [PATCH 061/110] Fix vignette re. old clobberable version default + use versions_end - Default is now to not mark any versions as clobberable; simply remove discussion of old default as it was to explain a surprise/annoyance in normal use. - Favor using `$versions_end` to get the latest version; while in examples it's probably similar, in general, it's more "correct" and should be faster. --- vignettes/archive.Rmd | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index d0deaf52..bfd67a46 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -172,16 +172,6 @@ date was June 1, 2021. From this we can infer that the doctor's visits signal was 2 days latent on June 1. Also, we can see that the metadata in the `epi_df` object has the version date recorded in the `as_of` field. -By default, using the maximum of the `version` column in the underlying data table in an -`epi_archive` object itself generates a snapshot of the latest values of signal -variables in the entire archive. The `epix_as_of()` function issues a warning in -this case, since updates to the current version may still come in at a later -point in time, due to various reasons, such as synchronization issues. - -```{r} -x_latest <- epix_as_of(x, max_version = max(x$DT$version)) -``` - Below, we pull several snapshots from the archive, spaced one month apart. We overlay the corresponding signal curves as colored lines, with the version dates marked by dotted vertical lines, and draw the latest curve in black (from the @@ -384,7 +374,7 @@ points in time and forecast horizons. The former comes from using `epi_slide()` to the latest snapshot of the data `x_latest`. ```{r, message = FALSE, warning = FALSE, fig.width = 9, fig.height = 6} -x_latest <- epix_as_of(x, max_version = max(x$DT$version)) +x_latest <- epix_as_of(x, x$versions_end) # Simple function to produce forecasts k weeks ahead k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { From aa73944d5458a119c704bf8198c48f6a912351fc Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Mon, 5 Aug 2024 17:35:39 -0700 Subject: [PATCH 062/110] Rename max_version -> version in epix_as_of since this seems like more appropriate and consistent naming for the main use case of extracting an `epi_df` snapshot. --- R/methods-epi_archive.R | 45 ++++++++++++++--------- man/epix_as_of.Rd | 21 ++++++++--- tests/testthat/test-methods-epi_archive.R | 10 ++--- vignettes/archive.Rmd | 4 +- 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index 169e9270..2fc9d58f 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -6,26 +6,28 @@ #' examples. #' #' @param x An `epi_archive` object -#' @param max_version Time value specifying the max version to permit in the +#' @param version Time value specifying the max version to permit in the #' snapshot. That is, the snapshot will comprise the unique rows of the #' current archive data that represent the most up-to-date signal values, as -#' of the specified `max_version` (and whose time values are at least +#' of the specified `version` (and whose time values are at least #' `min_time_value`.) #' @param min_time_value Time value specifying the min time value to permit in #' the snapshot. Default is `-Inf`, which effectively means that there is no #' minimum considered. #' @param all_versions If `all_versions = TRUE`, then the output will be in #' `epi_archive` format, and contain rows in the specified `time_value` range -#' having `version <= max_version`. The resulting object will cover a +#' having `version <= version`. The resulting object will cover a #' potentially narrower `version` and `time_value` range than `x`, depending #' on user-provided arguments. Otherwise, there will be one row in the output -#' for the `max_version` of each `time_value`. Default is `FALSE`. +#' for the `version` of each `time_value`. Default is `FALSE`. +#' @param max_version `r lifecycle::badge("deprecated")` please use `version` +#' argument instead. #' @return An `epi_df` object. #' #' @examples #' epix_as_of( #' archive_cases_dv_subset, -#' max_version = max(archive_cases_dv_subset$DT$version) +#' version = max(archive_cases_dv_subset$DT$version) #' ) #' #' range(archive_cases_dv_subset$DT$version) # 2020-06-02 -- 2021-12-01 @@ -58,31 +60,37 @@ #' #' @importFrom data.table between key #' @export -epix_as_of <- function(x, max_version, min_time_value = -Inf, all_versions = FALSE) { +epix_as_of <- function(x, version, min_time_value = -Inf, all_versions = FALSE, + max_version = deprecated()) { assert_class(x, "epi_archive") + if (lifecycle::is_present(max_version)) { + lifecycle::deprecate_warn("0.8.1", "epix_as_of(max_version =)", "epix_as_of(version =)") + version <- max_version + } + other_keys <- setdiff( key(x$DT), c("geo_value", "time_value", "version") ) - # Check a few things on max_version - if (!identical(class(max_version), class(x$DT$version))) { + # Check a few things on version + if (!identical(class(version), class(x$DT$version))) { cli_abort( - "`max_version` must have the same `class` vector as `epi_archive$DT$version`." + "`version` must have the same `class` vector as `epi_archive$DT$version`." ) } - if (!identical(typeof(max_version), typeof(x$DT$version))) { + if (!identical(typeof(version), typeof(x$DT$version))) { cli_abort( - "`max_version` must have the same `typeof` as `epi_archive$DT$version`." + "`version` must have the same `typeof` as `epi_archive$DT$version`." ) } - assert_scalar(max_version, na.ok = FALSE) - if (max_version > x$versions_end) { - cli_abort("`max_version` must be at most `epi_archive$versions_end`.") + assert_scalar(version, na.ok = FALSE) + if (version > x$versions_end) { + cli_abort("`version` must be at most `epi_archive$versions_end`.") } assert_logical(all_versions, len = 1) - if (!is.na(x$clobberable_versions_start) && max_version >= x$clobberable_versions_start) { + if (!is.na(x$clobberable_versions_start) && version >= x$clobberable_versions_start) { cli_warn( 'Getting data as of some recent version which could still be overwritten (under routine circumstances) without assigning a new @@ -96,13 +104,14 @@ epix_as_of <- function(x, max_version, min_time_value = -Inf, all_versions = FAL # Filter by version and return if (all_versions) { # epi_archive is copied into result, so we can modify result directly - result <- epix_truncate_versions_after(x, max_version) + result <- epix_truncate_versions_after(x, version) result$DT <- result$DT[time_value >= min_time_value, ] # nolint: object_usage_linter return(result) } # Make sure to use data.table ways of filtering and selecting - as_of_epi_df <- x$DT[time_value >= min_time_value & version <= max_version, ] %>% # nolint: object_usage_linter + .version <- version # workaround for `i` arg not supporting `..` feature + as_of_epi_df <- x$DT[time_value >= min_time_value & version <= .version, ] %>% # nolint: object_usage_linter unique( by = c("geo_value", "time_value", other_keys), fromLast = TRUE @@ -110,7 +119,7 @@ epix_as_of <- function(x, max_version, min_time_value = -Inf, all_versions = FAL tibble::as_tibble() %>% dplyr::select(-"version") %>% as_epi_df( - as_of = max_version, + as_of = version, other_keys = other_keys ) diff --git a/man/epix_as_of.Rd b/man/epix_as_of.Rd index 4ab23882..c3682489 100644 --- a/man/epix_as_of.Rd +++ b/man/epix_as_of.Rd @@ -4,15 +4,21 @@ \alias{epix_as_of} \title{Generate a snapshot from an \code{epi_archive} object} \usage{ -epix_as_of(x, max_version, min_time_value = -Inf, all_versions = FALSE) +epix_as_of( + x, + version, + min_time_value = -Inf, + all_versions = FALSE, + max_version = deprecated() +) } \arguments{ \item{x}{An \code{epi_archive} object} -\item{max_version}{Time value specifying the max version to permit in the +\item{version}{Time value specifying the max version to permit in the snapshot. That is, the snapshot will comprise the unique rows of the current archive data that represent the most up-to-date signal values, as -of the specified \code{max_version} (and whose time values are at least +of the specified \code{version} (and whose time values are at least \code{min_time_value}.)} \item{min_time_value}{Time value specifying the min time value to permit in @@ -21,10 +27,13 @@ minimum considered.} \item{all_versions}{If \code{all_versions = TRUE}, then the output will be in \code{epi_archive} format, and contain rows in the specified \code{time_value} range -having \code{version <= max_version}. The resulting object will cover a +having \code{version <= version}. The resulting object will cover a potentially narrower \code{version} and \code{time_value} range than \code{x}, depending on user-provided arguments. Otherwise, there will be one row in the output -for the \code{max_version} of each \code{time_value}. Default is \code{FALSE}.} +for the \code{version} of each \code{time_value}. Default is \code{FALSE}.} + +\item{max_version}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} please use \code{version} +argument instead.} } \value{ An \code{epi_df} object. @@ -37,7 +46,7 @@ examples. \examples{ epix_as_of( archive_cases_dv_subset, - max_version = max(archive_cases_dv_subset$DT$version) + version = max(archive_cases_dv_subset$DT$version) ) range(archive_cases_dv_subset$DT$version) # 2020-06-02 -- 2021-12-01 diff --git a/tests/testthat/test-methods-epi_archive.R b/tests/testthat/test-methods-epi_archive.R index 6686400b..f035c8c5 100644 --- a/tests/testthat/test-methods-epi_archive.R +++ b/tests/testthat/test-methods-epi_archive.R @@ -25,13 +25,13 @@ test_that("Errors are thrown due to bad epix_as_of inputs", { test_that("Warning against max_version being clobberable", { # none by default - expect_warning(regexp = NA, ea %>% epix_as_of(max_version = max(ea$DT$version))) - expect_warning(regexp = NA, ea %>% epix_as_of(max_version = min(ea$DT$version))) + expect_warning(regexp = NA, ea %>% epix_as_of(max(ea$DT$version))) + expect_warning(regexp = NA, ea %>% epix_as_of(min(ea$DT$version))) # but with `clobberable_versions_start` non-`NA`, yes ea_with_clobberable <- ea ea_with_clobberable$clobberable_versions_start <- max(ea_with_clobberable$DT$version) - expect_warning(ea_with_clobberable %>% epix_as_of(max_version = max(ea$DT$version))) - expect_warning(regexp = NA, ea_with_clobberable %>% epix_as_of(max_version = min(ea$DT$version))) + expect_warning(ea_with_clobberable %>% epix_as_of(max(ea$DT$version))) + expect_warning(regexp = NA, ea_with_clobberable %>% epix_as_of(min(ea$DT$version))) }) test_that("epix_as_of properly grabs the data and doesn't mutate key", { @@ -43,7 +43,7 @@ test_that("epix_as_of properly grabs the data and doesn't mutate key", { old_key <- data.table::key(ea2$DT) edf_as_of <- ea2 %>% - epix_as_of(max_version = as.Date("2020-06-03")) + epix_as_of(as.Date("2020-06-03")) edf_expected <- as_epi_df(tibble( geo_value = "ca", diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index bfd67a46..1f5ee1e3 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -159,7 +159,7 @@ of the archive in `epi_df` format. This represents the most up-to-date values of the signal variables as of a given version. ```{r} -x_snapshot <- epix_as_of(x, max_version = as.Date("2021-06-01")) +x_snapshot <- epix_as_of(x, as.Date("2021-06-01")) class(x_snapshot) head(x_snapshot) max(x_snapshot$time_value) @@ -183,7 +183,7 @@ theme_set(theme_bw()) self_max <- max(x$DT$version) versions <- seq(as.Date("2020-06-01"), self_max - 1, by = "1 month") snapshots <- map_dfr(versions, function(v) { - epix_as_of(x, max_version = v) %>% mutate(version = v) + epix_as_of(x, v) %>% mutate(version = v) }) %>% bind_rows( x_latest %>% mutate(version = self_max) From 547d156228e2f093119fde131a0b6ebccc122e24 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Tue, 20 Aug 2024 16:05:35 -0700 Subject: [PATCH 063/110] fix(epix_slide): partial time_value -> version output col rename --- R/grouped_epi_archive.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index d97d7307..2c7bbea9 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -278,7 +278,7 @@ epix_slide.grouped_epi_archive <- function( checkmate::assert_string(.new_col_name, null.ok = TRUE) if (identical(.new_col_name, "time_value")) { - cli_abort('`new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation') # nolint: line_length_linter + cli_abort('`.new_col_name` must not be `"version"`; `epix_slide()` uses that column name to attach which of the `.versions` is associated with each slide computation') # nolint: line_length_linter } assert_logical(.all_versions, len = 1L) @@ -342,7 +342,7 @@ epix_slide.grouped_epi_archive <- function( } } else { # vector or packed data.frame-type column (note: new_col_name of - # "time_value" is disallowed): + # "version" is disallowed): res[[new_col_name]] <- comp_value } From 4290363c3b1a5443ac4da3b3504b094c99664f00 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 21 Aug 2024 16:27:30 -0700 Subject: [PATCH 064/110] Add group_vars.grouped_epi_archive --- NAMESPACE | 1 + R/archive.R | 9 +++++++-- R/grouped_epi_archive.R | 11 +++++++++-- man/group_by.epi_archive.Rd | 12 ++++++++++-- tests/testthat/test-methods-epi_archive.R | 6 +++++- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index fa4f76df..a417837f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -27,6 +27,7 @@ S3method(group_by,epi_df) S3method(group_by,grouped_epi_archive) S3method(group_by_drop_default,grouped_epi_archive) S3method(group_modify,epi_df) +S3method(group_vars,grouped_epi_archive) S3method(groups,grouped_epi_archive) S3method(guess_period,Date) S3method(guess_period,POSIXt) diff --git a/R/archive.R b/R/archive.R index f7b11aff..48dbf9ec 100644 --- a/R/archive.R +++ b/R/archive.R @@ -585,8 +585,8 @@ print.epi_archive <- function(x, ..., class = TRUE, methods = TRUE) { #' `...`. #' @param .drop As described in [`dplyr::group_by`]; determines treatment of #' factor columns. -#' @param x For `groups` or `ungroup`: a `grouped_epi_archive`; for -#' `is_grouped_epi_archive`: any object +#' @param x For `groups`, `group_vars`, or `ungroup`: a `grouped_epi_archive`; +#' for `is_grouped_epi_archive`: any object #' @param .tbl (For `group_by_drop_default`:) an `epi_archive` or #' `grouped_epi_archive` (`epi_archive` dispatches to the S3 default method; #' `grouped_epi_archive` dispatches its own S3 method) @@ -665,6 +665,11 @@ print.epi_archive <- function(x, ..., class = TRUE, methods = TRUE) { #' group_by(geo_value, age_group) %>% #' ungroup(age_group) #' +#' # To get the grouping variable names as a character vector: +#' toy_archive %>% +#' group_by(geo_value) %>% +#' group_vars() +#' #' # To get the grouping variable names as a `list` of `name`s (a.k.a. symbols): #' toy_archive %>% #' group_by(geo_value) %>% diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 2c7bbea9..c63ae98e 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -55,7 +55,7 @@ new_grouped_epi_archive <- function(x, vars, drop) { or `ungroup` first.", class = "epiprocess__grouped_epi_archive__ungrouped_arg_is_already_grouped", epiprocess__ungrouped_class = class(x), - epiprocess__ungrouped_groups = groups(x) + epiprocess__ungrouped_group_vars = group_vars(x) ) } assert_class(x, "epi_archive") @@ -160,6 +160,14 @@ group_by_drop_default.grouped_epi_archive <- function(.tbl) { .tbl$private$drop } +#' @include methods-epi_archive.R +#' @rdname group_by.epi_archive +#' +#' @importFrom dplyr group_vars +#' @export +group_vars.grouped_epi_archive <- function(x) { + x$private$vars +} #' @include methods-epi_archive.R #' @rdname group_by.epi_archive @@ -170,7 +178,6 @@ groups.grouped_epi_archive <- function(x) { rlang::syms(x$private$vars) } - #' @include methods-epi_archive.R #' @rdname group_by.epi_archive #' diff --git a/man/group_by.epi_archive.Rd b/man/group_by.epi_archive.Rd index e7c46311..aa6c2e2a 100644 --- a/man/group_by.epi_archive.Rd +++ b/man/group_by.epi_archive.Rd @@ -5,6 +5,7 @@ \alias{grouped_epi_archive} \alias{group_by.grouped_epi_archive} \alias{group_by_drop_default.grouped_epi_archive} +\alias{group_vars.grouped_epi_archive} \alias{groups.grouped_epi_archive} \alias{ungroup.grouped_epi_archive} \alias{is_grouped_epi_archive} @@ -16,6 +17,8 @@ \method{group_by_drop_default}{grouped_epi_archive}(.tbl) +\method{group_vars}{grouped_epi_archive}(x) + \method{groups}{grouped_epi_archive}(x) \method{ungroup}{grouped_epi_archive}(x, ...) @@ -52,8 +55,8 @@ factor columns.} \item{.tbl}{A \code{grouped_epi_archive} object.} -\item{x}{For \code{groups} or \code{ungroup}: a \code{grouped_epi_archive}; for -\code{is_grouped_epi_archive}: any object} +\item{x}{For \code{groups}, \code{group_vars}, or \code{ungroup}: a \code{grouped_epi_archive}; +for \code{is_grouped_epi_archive}: any object} } \description{ \code{group_by} and related methods for \code{epi_archive}, \code{grouped_epi_archive} @@ -131,6 +134,11 @@ toy_archive \%>\% group_by(geo_value, age_group) \%>\% ungroup(age_group) +# To get the grouping variable names as a character vector: +toy_archive \%>\% + group_by(geo_value) \%>\% + group_vars() + # To get the grouping variable names as a `list` of `name`s (a.k.a. symbols): toy_archive \%>\% group_by(geo_value) \%>\% diff --git a/tests/testthat/test-methods-epi_archive.R b/tests/testthat/test-methods-epi_archive.R index f035c8c5..803a11bd 100644 --- a/tests/testthat/test-methods-epi_archive.R +++ b/tests/testthat/test-methods-epi_archive.R @@ -110,7 +110,6 @@ test_that("epix_truncate_version_after returns the same grouping type as input e expect_true(is_grouped_epi_archive(ea_as_of)) }) - test_that("epix_truncate_version_after returns the same groups as input grouped_epi_archive", { ea2 <- ea2_data %>% as_epi_archive() @@ -122,3 +121,8 @@ test_that("epix_truncate_version_after returns the same groups as input grouped_ epix_truncate_versions_after(max_version = as.Date("2020-06-04")) expect_equal(ea_as_of %>% groups(), ea_expected %>% groups()) }) + +test_that("group_vars works as expected", { + expect_equal(ea2_data %>% as_epi_archive() %>% group_by(geo_value) %>% group_vars(), + "geo_value") +}) From 4b112e57221ef75f6cc2d24a208512ac38aa72b6 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 21 Aug 2024 23:51:59 -0700 Subject: [PATCH 065/110] refactor+tweak: add+use `format_class_vec` helper for messages Collapse with empty string in order to not have extra whitespace if used with `cat` rather than `cli_*`. --- R/archive.R | 2 +- R/utils.R | 10 +++++++++- man/format_class_vec.Rd | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 man/format_class_vec.Rd diff --git a/R/archive.R b/R/archive.R index 48dbf9ec..5cf55ff6 100644 --- a/R/archive.R +++ b/R/archive.R @@ -49,7 +49,7 @@ validate_version_bound <- function(version_bound, x, na_ok = FALSE, if (!identical(class(version_bound), class(x[["version"]]))) { cli_abort( "{version_bound_arg} must have the same `class` vector as x$version, - which has a `class` of {paste(collapse = ' ', deparse(class(x$version)))}", + which has a `class` of {format_class_vec(class(x$version))}", class = "epiprocess__version_bound_mismatched_class" ) } diff --git a/R/utils.R b/R/utils.R index c585abec..a6a4382b 100644 --- a/R/utils.R +++ b/R/utils.R @@ -89,6 +89,14 @@ paste_lines <- function(lines) { paste(paste0(lines, "\n"), collapse = "") } +#' Format a class vector as a string via deparsing it +#' +#' @param class_vec `chr`; output of `class(object)` for some `object` +#' @return string +format_class_vec <- function(class_vec) { + paste(collapse = "", deparse(class_vec)) +} + #' Assert that a sliding computation function takes enough args #' #' @param f Function; specifies a computation to slide over an `epi_df` or @@ -451,7 +459,7 @@ as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_tim } cli_abort( - "Can't convert an object of class {paste(collapse = ' ', deparse(class(f)))} + "Can't convert an object of class {format_class_vec(class(f))} to a slide computation", class = "epiprocess__as_slide_computation__cant_convert_catchall", epiprocess__f = f, diff --git a/man/format_class_vec.Rd b/man/format_class_vec.Rd new file mode 100644 index 00000000..b2b96678 --- /dev/null +++ b/man/format_class_vec.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{format_class_vec} +\alias{format_class_vec} +\title{Format a class vector as a string via deparsing it} +\usage{ +format_class_vec(class_vec) +} +\arguments{ +\item{class_vec}{\code{chr}; output of \code{class(object)} for some \code{object}} +} +\value{ +string +} +\description{ +Format a class vector as a string via deparsing it +} From 8838c712e64fa297f8e72beac05b66d83399667e Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 22 Aug 2024 00:29:41 -0700 Subject: [PATCH 066/110] WIP Add docs for de-dupe approach, part of the required validation Forbidding `new_col_name` being among the labeling columns addresses some dedupe cases where deduping would always lead to failure except for completely-redundant computations (that only output computation labels rather than and actual computation). - This might not be complete in a edge case where `"slide_value"` is a grouping variable. (E.g., from using a slide to assign a categorical trend, then doing a grouped slide based on the trend.) This is definitely only part of the dedupe handling. Unpacked-column outputs need to actually be de-duped. Also, fix incorrect documentation for time_value filter for .all_versions = TRUE while rebasing on other slide updates. --- R/methods-epi_archive.R | 19 +++++++++++-------- R/slide.R | 19 ++++++++++++++++++- R/utils.R | 22 ++++++++++++++++++++++ man/epi_slide.Rd | 4 +++- man/epix_slide.Rd | 19 +++++++++++-------- man/format_chr_with_quotes.Rd | 19 +++++++++++++++++++ 6 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 man/format_chr_with_quotes.Rd diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index 2fc9d58f..1471ea8a 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -650,15 +650,18 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' set to a regularly-spaced sequence of values set to cover the range of #' `version`s in the `DT` plus the `versions_end`; the spacing of values will #' be guessed (using the GCD of the skips between values). -#' @param .new_col_name String indicating the name of the new column that will -#' contain the derivative values. The default is "slide_value" unless your -#' slide computations output data frames, in which case they will be unpacked -#' into the constituent columns and those names used. Note that setting -#' `.new_col_name` equal to an existing column name will overwrite this column. +#' @param .new_col_name Either `NULL` or a string indicating the name of the new +#' column that will contain the derived values. The default, `NULL`, will use +#' the name "slide_value" unless your slide computations output data frames, +#' in which case they will be unpacked into the constituent columns and those +#' names used. If the resulting column name(s) overlap with the column names +#' used for labeling the computations, which are `group_vars(x)` and +#' `"version"`, then the values for these columns must be identical to the +#' labels we assign. #' @param .all_versions (Not the same as `.all_rows` parameter of `epi_slide`.) If -#' TRUE, then `.f` will be passed the version history (all -#' `version <= .ref_time_value`) for rows having `time_value` between -#' `.ref_time_value - before` and `.ref_time_value`. Otherwise, `.f` will be +#' `.all_versions = TRUE`, then `.f` will be passed the version history (all +#' `version <= .ref_time_value`) for rows having `time_value` of at least +#' `.version - before`. Otherwise, `.f` will be #' passed only the most recent `version` for every unique `time_value`. #' Default is `FALSE`. #' @return A tibble whose columns are: the grouping variables, `time_value`, diff --git a/R/slide.R b/R/slide.R index a9f3a86c..49827600 100644 --- a/R/slide.R +++ b/R/slide.R @@ -27,7 +27,9 @@ #' and can also refer to `.x`, `.group_key`, and `.ref_time_value`. See #' details. #' @param .new_col_name String indicating the name of the new column that will -#' contain the derivative values. Default is "slide_value"; note that setting +#' contain the derivative values. The default is "slide_value" unless your +#' slide computations output data frames, in which case they will be unpacked +#' into the constituent columns and those names used. Note that setting #' `new_col_name` equal to an existing column name will overwrite this column. #' #' @template basic-slide-details @@ -169,6 +171,21 @@ epi_slide <- function( } } + checkmate::assert_string(new_col_name, null.ok = TRUE) + if (!is.null(new_col_name)) { + if (new_col_name %in% group_vars(x)) { + cli_abort(c("`new_col_name` must not be one of the grouping column name(s); + `epi_slide()` uses these column name(s) to label what group + each slide computation came from.", + "i" = "{cli::qty(length(group_vars(x)))} grouping column name{?s} + {?was/were} {format_chr_with_quotes(group_vars(x))}", + "x" = "`new_col_name` was {format_chr_with_quotes(new_col_name)}")) + } + if (identical(new_col_name, "time_value")) { + cli_abort('`new_col_name` must not be `"time_value"`; `epi_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation') # nolint: line_length_linter + } + } + # Arrange by increasing time_value x <- arrange(.x, .data$time_value) diff --git a/R/utils.R b/R/utils.R index a6a4382b..e3fd28bf 100644 --- a/R/utils.R +++ b/R/utils.R @@ -97,6 +97,28 @@ format_class_vec <- function(class_vec) { paste(collapse = "", deparse(class_vec)) } +#' Format a character vector as a string via deparsing/quoting each +#' +#' @param x `chr`; e.g., `colnames` of some data frame +#' @param empty string; what should be output if `x` is of length 0? +#' @return string +format_chr_with_quotes <- function(x, empty = "*none*") { + if (length(x) == 0L) { + empty + } else { + # Deparse to get quoted + escape-sequenced versions of varnames; collapse to + # single line (assuming no newlines in `x`). Though if we hand this to cli + # it may insert them (even in middle of quotes) while wrapping lines. + deparsed_collapsed <- paste(collapse = "", deparse(x)) + if (length(x) == 1L) { + deparsed_collapsed + } else { + # remove surrounding `c()`: + substr(deparsed_collapsed, 3L, nchar(deparsed_collapsed) - 1L) + } + } +} + #' Assert that a sliding computation function takes enough args #' #' @param f Function; specifies a computation to slide over an `epi_df` or diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index fc675071..950c19e3 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -70,7 +70,9 @@ window. If missing, then this will be set to all unique time values in the underlying data table, by default.} \item{.new_col_name}{String indicating the name of the new column that will -contain the derivative values. Default is "slide_value"; note that setting +contain the derivative values. The default is "slide_value" unless your +slide computations output data frames, in which case they will be unpacked +into the constituent columns and those names used. Note that setting \code{new_col_name} equal to an existing column name will overwrite this column.} \item{.all_rows}{If \code{.all_rows = TRUE}, then all rows of \code{.x} will be kept in diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index 75a99994..e71c775d 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -74,16 +74,19 @@ in the archive is "day", and the \code{.ref_time_value} is January 8, then the smallest time_value in the snapshot will be January 1. If missing, then the default is no limit on the time values, so the full snapshot is given.} -\item{.new_col_name}{String indicating the name of the new column that will -contain the derivative values. The default is "slide_value" unless your -slide computations output data frames, in which case they will be unpacked -into the constituent columns and those names used. Note that setting -\code{.new_col_name} equal to an existing column name will overwrite this column.} +\item{.new_col_name}{Either \code{NULL} or a string indicating the name of the new +column that will contain the derived values. The default, \code{NULL}, will use +the name "slide_value" unless your slide computations output data frames, +in which case they will be unpacked into the constituent columns and those +names used. If the resulting column name(s) overlap with the column names +used for labeling the computations, which are \code{group_vars(x)} and +\code{"version"}, then the values for these columns must be identical to the +labels we assign.} \item{.all_versions}{(Not the same as \code{.all_rows} parameter of \code{epi_slide}.) If -TRUE, then \code{.f} will be passed the version history (all -\code{version <= .ref_time_value}) for rows having \code{time_value} between -\code{.ref_time_value - before} and \code{.ref_time_value}. Otherwise, \code{.f} will be +\code{.all_versions = TRUE}, then \code{.f} will be passed the version history (all +\code{version <= .ref_time_value}) for rows having \code{time_value} of at least +\code{.version - before}. Otherwise, \code{.f} will be passed only the most recent \code{version} for every unique \code{time_value}. Default is \code{FALSE}.} diff --git a/man/format_chr_with_quotes.Rd b/man/format_chr_with_quotes.Rd new file mode 100644 index 00000000..b62b172e --- /dev/null +++ b/man/format_chr_with_quotes.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{format_chr_with_quotes} +\alias{format_chr_with_quotes} +\title{Format a character vector as a string via deparsing/quoting each} +\usage{ +format_chr_with_quotes(x, empty = "*none*") +} +\arguments{ +\item{x}{\code{chr}; e.g., \code{colnames} of some data frame} + +\item{empty}{string; what should be output if \code{x} is of length 0?} +} +\value{ +string +} +\description{ +Format a character vector as a string via deparsing/quoting each +} From 91279528ac146b5819b0aeff430b7dfe70a89383 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Thu, 22 Aug 2024 07:39:59 +0000 Subject: [PATCH 067/110] Style and fix&improve some .new_col_name validation --- R/grouped_epi_archive.R | 15 +++++++++++++-- R/slide.R | 11 ++++++----- tests/testthat/test-methods-epi_archive.R | 6 ++++-- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index c63ae98e..0506af9c 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -284,8 +284,19 @@ epix_slide.grouped_epi_archive <- function( validate_slide_window_arg(.before, .x$private$ungrouped$time_type) checkmate::assert_string(.new_col_name, null.ok = TRUE) - if (identical(.new_col_name, "time_value")) { - cli_abort('`.new_col_name` must not be `"version"`; `epix_slide()` uses that column name to attach which of the `.versions` is associated with each slide computation') # nolint: line_length_linter + if (!is.null(.new_col_name)) { + if (.new_col_name %in% x$private$vars) { + cli_abort(c("`new_col_name` must not be one of the grouping column name(s); + `epix_slide()` uses these column name(s) to label what group + each slide computation came from.", + "i" = "{cli::qty(length(x$private$vars))} grouping column name{?s} + {?was/were} {format_chr_with_quotes(x$private$vars)}", + "x" = "`new_col_name` was {format_chr_with_quotes(new_col_name)}" + )) + } + if (identical(.new_col_name, "version")) { + cli_abort('`.new_col_name` must not be `"version"`; `epix_slide()` uses that column name to attach the element of `.versions` associated with each slide computation') # nolint: line_length_linter + } } assert_logical(.all_versions, len = 1L) diff --git a/R/slide.R b/R/slide.R index 49827600..a1ee8c54 100644 --- a/R/slide.R +++ b/R/slide.R @@ -174,15 +174,16 @@ epi_slide <- function( checkmate::assert_string(new_col_name, null.ok = TRUE) if (!is.null(new_col_name)) { if (new_col_name %in% group_vars(x)) { - cli_abort(c("`new_col_name` must not be one of the grouping column name(s); + cli_abort(c("`.new_col_name` must not be one of the grouping column name(s); `epi_slide()` uses these column name(s) to label what group each slide computation came from.", - "i" = "{cli::qty(length(group_vars(x)))} grouping column name{?s} - {?was/were} {format_chr_with_quotes(group_vars(x))}", - "x" = "`new_col_name` was {format_chr_with_quotes(new_col_name)}")) + "i" = "{cli::qty(length(group_vars(.x)))} grouping column name{?s} + {?was/were} {format_chr_with_quotes(group_vars(.x))}", + "x" = "`.new_col_name` was {format_chr_with_quotes(.new_col_name)}" + )) } if (identical(new_col_name, "time_value")) { - cli_abort('`new_col_name` must not be `"time_value"`; `epi_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation') # nolint: line_length_linter + cli_abort('`.new_col_name` must not be `"time_value"`; `epi_slide()` uses that column name to attach the element of `.ref_time_values` associated with each slide computation') # nolint: line_length_linter } } diff --git a/tests/testthat/test-methods-epi_archive.R b/tests/testthat/test-methods-epi_archive.R index 803a11bd..45ba6ea1 100644 --- a/tests/testthat/test-methods-epi_archive.R +++ b/tests/testthat/test-methods-epi_archive.R @@ -123,6 +123,8 @@ test_that("epix_truncate_version_after returns the same groups as input grouped_ }) test_that("group_vars works as expected", { - expect_equal(ea2_data %>% as_epi_archive() %>% group_by(geo_value) %>% group_vars(), - "geo_value") + expect_equal( + ea2_data %>% as_epi_archive() %>% group_by(geo_value) %>% group_vars(), + "geo_value" + ) }) From 7af57cc62e4925eebb89dea8ba0c4e67dc415c6d Mon Sep 17 00:00:00 2001 From: brookslogan Date: Mon, 26 Aug 2024 20:48:52 +0000 Subject: [PATCH 068/110] style: styler (GHA) --- R/grouped_epi_archive.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 0506af9c..32efb1aa 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -219,7 +219,6 @@ epix_slide.grouped_epi_archive <- function( .versions = NULL, .new_col_name = NULL, .all_versions = FALSE) { - # Perform some deprecated argument checks without using ` = # deprecated()` in the function signature, because they are from # early development versions and much more likely to be clutter than From 1181b97a49cb6684537ab27df5c75059343d9a79 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 29 Aug 2024 12:27:20 -0700 Subject: [PATCH 069/110] Fix slide rebase issues, other partial renames, dotprefix internalfn Since we're passing along ... from outer fns to our inner helper fns taking ..., the internal fns should also dot-prefix if outer should. --- R/grouped_epi_archive.R | 30 ++++++++--------- R/slide.R | 72 ++++++++++++++++++++--------------------- R/utils.R | 8 ++--- 3 files changed, 54 insertions(+), 56 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 32efb1aa..b37c31bc 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -224,7 +224,7 @@ epix_slide.grouped_epi_archive <- function( # early development versions and much more likely to be clutter than # informative in the signature. provided_args <- rlang::call_args_names(rlang::call_match()) - if (any(provided_args %in% c("x", "f", "before", "ref_time_values", "new_col_name", "all_versions", "group_by"))) { + if (any(provided_args %in% c("x", "f", "before", "ref_time_values", "new_col_name", "all_versions"))) { cli::cli_abort( "epix_slide: you are using one of the following old argument names: `x`, `f`, `before`, `ref_time_values`, `new_col_name`, `all_versions`. Please use the new names: `.x`, `.f`, `.before`, `.ref_time_values`, @@ -276,20 +276,18 @@ epix_slide.grouped_epi_archive <- function( # Sort, for consistency with `epi_slide`, although the current # implementation doesn't take advantage of it. .versions <- sort(.versions) - ref_time_values <- sort(ref_time_values) - .versions <- sort(.versions) } validate_slide_window_arg(.before, .x$private$ungrouped$time_type) checkmate::assert_string(.new_col_name, null.ok = TRUE) if (!is.null(.new_col_name)) { - if (.new_col_name %in% x$private$vars) { - cli_abort(c("`new_col_name` must not be one of the grouping column name(s); + if (.new_col_name %in% .x$private$vars) { + cli_abort(c("`.new_col_name` must not be one of the grouping column name(s); `epix_slide()` uses these column name(s) to label what group each slide computation came from.", - "i" = "{cli::qty(length(x$private$vars))} grouping column name{?s} - {?was/were} {format_chr_with_quotes(x$private$vars)}", + "i" = "{cli::qty(length(.x$private$vars))} grouping column name{?s} + {?was/were} {format_chr_with_quotes(.x$private$vars)}", "x" = "`new_col_name` was {format_chr_with_quotes(new_col_name)}" )) } @@ -321,10 +319,10 @@ epix_slide.grouped_epi_archive <- function( # Computation for one group, one time value comp_one_grp <- function(.data_group, .group_key, f, ..., - ref_time_value, + version, new_col_name) { # Carry out the specified computation - comp_value <- f(.data_group, .group_key, ref_time_value, ...) + comp_value <- f(.data_group, .group_key, version, ...) # If this wasn't a tidyeval computation, we still need to check the output # types. We'll let `group_modify` and `vec_rbind` deal with checking for @@ -347,7 +345,7 @@ epix_slide.grouped_epi_archive <- function( # redundant work. `group_modify()` provides the group key, we provide the # ref time value (appropriately recycled) and comp_value (appropriately # named / unpacked, for quick feedback) - res <- list(version = vctrs::vec_rep(ref_time_value, vctrs::vec_size(comp_value))) + res <- list(version = vctrs::vec_rep(version, vctrs::vec_size(comp_value))) if (is.null(new_col_name)) { if (inherits(comp_value, "data.frame")) { @@ -371,12 +369,12 @@ epix_slide.grouped_epi_archive <- function( return(validate_tibble(new_tibble(res))) } - out <- lapply(versions, function(ref_time_value) { + out <- lapply(.versions, function(version) { # Ungrouped as-of data; `epi_df` if `all_versions` is `FALSE`, # `epi_archive` if `all_versions` is `TRUE`: as_of_raw <- .x$private$ungrouped %>% epix_as_of( - ref_time_value, - min_time_value = ref_time_value - .before, + version, + min_time_value = version - .before, all_versions = .all_versions ) @@ -412,7 +410,7 @@ epix_slide.grouped_epi_archive <- function( # Convert each subgroup chunk to an archive before running the calculation. group_modify_fn <- function(.data_group, .group_key, f, ..., - ref_time_value, + version, new_col_name) { # .data_group is coming from as_of_df as a tibble, but we # want to feed `comp_one_grp` an `epi_archive` backed by a @@ -423,7 +421,7 @@ epix_slide.grouped_epi_archive <- function( .data_group_archive$DT <- .data_group comp_one_grp(.data_group_archive, .group_key, f = f, ..., - ref_time_value = ref_time_value, + version = version, new_col_name = new_col_name ) } @@ -434,7 +432,7 @@ epix_slide.grouped_epi_archive <- function( dplyr::group_by(as_of_df, !!!syms(.x$private$vars), .drop = .x$private$drop), group_modify_fn, f = f, ..., - ref_time_value = ref_time_value, + version = version, new_col_name = .new_col_name, .keep = TRUE ) diff --git a/R/slide.R b/R/slide.R index a1ee8c54..bc879d09 100644 --- a/R/slide.R +++ b/R/slide.R @@ -171,9 +171,9 @@ epi_slide <- function( } } - checkmate::assert_string(new_col_name, null.ok = TRUE) - if (!is.null(new_col_name)) { - if (new_col_name %in% group_vars(x)) { + checkmate::assert_string(.new_col_name, null.ok = TRUE) + if (!is.null(.new_col_name)) { + if (.new_col_name %in% group_vars(.x)) { cli_abort(c("`.new_col_name` must not be one of the grouping column name(s); `epi_slide()` uses these column name(s) to label what group each slide computation came from.", @@ -182,24 +182,24 @@ epi_slide <- function( "x" = "`.new_col_name` was {format_chr_with_quotes(.new_col_name)}" )) } - if (identical(new_col_name, "time_value")) { + if (identical(.new_col_name, "time_value")) { cli_abort('`.new_col_name` must not be `"time_value"`; `epi_slide()` uses that column name to attach the element of `.ref_time_values` associated with each slide computation') # nolint: line_length_linter } } # Arrange by increasing time_value - x <- arrange(.x, .data$time_value) + .x <- arrange(.x, .data$time_value) # Now set up starts and stops for sliding/hopping starts <- .ref_time_values - before stops <- .ref_time_values + after - # If `f` is missing, interpret ... as an expression for tidy evaluation + # If `.f` is missing, interpret ... as an expression for tidy evaluation if (missing(.f)) { used_data_masking <- TRUE quosures <- enquos(...) if (length(quosures) == 0) { - cli_abort("If `f` is missing then a computation must be specified via `...`.") + cli_abort("If `.f` is missing then a computation must be specified via `...`.") } .f <- quosures @@ -231,29 +231,29 @@ epi_slide <- function( slide_one_grp <- function(.data_group, .group_key, # see `?group_modify` ..., # `...` to `epi_slide` forwarded here - f_factory, - starts, - stops, - ref_time_values, - all_rows, - new_col_name) { + .f_factory, + .starts, + .stops, + .ref_time_values, + .all_rows, + .new_col_name) { # Figure out which reference time values appear in the data group in the # first place (we need to do this because it could differ based on the # group, hence the setup/checks for the reference time values based on all # the data could still be off): - o <- ref_time_values %in% .data_group$time_value - starts <- starts[o] - stops <- stops[o] - kept_ref_time_values <- ref_time_values[o] + o <- .ref_time_values %in% .data_group$time_value + .starts <- .starts[o] + .stops <- .stops[o] + kept_ref_time_values <- .ref_time_values[o] - f <- f_factory(kept_ref_time_values) + f <- .f_factory(kept_ref_time_values) # Compute the slide values slide_values_list <- slider::hop_index( .x = .data_group, .i = .data_group$time_value, - .starts = starts, - .stops = stops, + .starts = .starts, + .stops = .stops, .f = f, .group_key, ... ) @@ -309,7 +309,7 @@ epi_slide <- function( } # If all rows, then pad slide values with NAs, else filter down data group - if (all_rows) { + if (.all_rows) { orig_values <- slide_values slide_values <- vctrs::vec_rep(vctrs::vec_cast(NA, orig_values), nrow(.data_group)) vctrs::vec_slice(slide_values, o) <- orig_values @@ -318,7 +318,7 @@ epi_slide <- function( } result <- - if (is.null(new_col_name)) { + if (is.null(.new_col_name)) { if (inherits(slide_values, "data.frame")) { # unpack into separate columns (without name prefix) and, if there are # re-bindings, make the last one win for determining column value & @@ -330,25 +330,25 @@ epi_slide <- function( } } else { # vector or packed data.frame-type column: - mutate(.data_group, !!new_col_name := slide_values) + mutate(.data_group, !!.new_col_name := slide_values) } return(result) } - x <- group_modify(x, slide_one_grp, + .x <- group_modify(.x, slide_one_grp, ..., - f_factory = f_wrapper_factory, - starts = starts, - stops = stops, - ref_time_values = .ref_time_values, - all_rows = .all_rows, - new_col_name = .new_col_name, + .f_factory = f_wrapper_factory, + .starts = starts, + .stops = stops, + .ref_time_values = .ref_time_values, + .all_rows = .all_rows, + .new_col_name = .new_col_name, .keep = FALSE ) - return(x) + return(.x) } #' Optimized slide function for performing common rolling computations on an @@ -480,9 +480,9 @@ epi_slide_opt <- function( if (nrow(.x) == 0L) { cli_abort( c( - "input data `x` unexpectedly has 0 rows", + "input data `.x` unexpectedly has 0 rows", "i" = "If this computation is occuring within an `epix_slide` call, - check that `epix_slide` `.ref_time_values` argument was set appropriately" + check that `epix_slide` `.versions` argument was set appropriately" ), class = "epiprocess__epi_slide_opt__0_row_input", epiprocess__x = .x @@ -577,13 +577,13 @@ epi_slide_opt <- function( } } - # Make a complete date sequence between min(x$time_value) and max(x$time_value). + # Make a complete date sequence between min(.x$time_value) and max(.x$time_value). date_seq_list <- full_date_seq(.x, before, after, time_type) all_dates <- date_seq_list$all_dates pad_early_dates <- date_seq_list$pad_early_dates pad_late_dates <- date_seq_list$pad_late_dates - # The position of a given column can be differ between input `x` and + # The position of a given column can be differ between input `.x` and # `.data_group` since the grouping step by default drops grouping columns. # To avoid rerunning `eval_select` for every `.data_group`, convert # positions of user-provided `col_names` into string column names. We avoid @@ -621,7 +621,7 @@ epi_slide_opt <- function( group will result in incorrect results", "i" = "Please change the grouping structure of the input data so that each group has non-duplicate time values (e.g. `x %>% group_by(geo_value) - %>% epi_slide_opt(f = frollmean)`)", + %>% epi_slide_opt(.f = frollmean)`)", "i" = "Use `epi_slide` to aggregate across groups" ), class = "epiprocess__epi_slide_opt__duplicate_time_values", diff --git a/R/utils.R b/R/utils.R index e3fd28bf..79f2e96d 100644 --- a/R/utils.R +++ b/R/utils.R @@ -494,9 +494,9 @@ as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_tim #' @rdname as_slide_computation #' @export #' @noRd -as_time_slide_computation <- function(f, ...) { +as_time_slide_computation <- function(.f, ...) { as_slide_computation( - f, ..., + .f, ..., .ref_time_value_long_varnames = ".ref_time_value", .ref_time_value_label = "reference time value" ) @@ -505,9 +505,9 @@ as_time_slide_computation <- function(f, ...) { #' @rdname as_slide_computation #' @export #' @noRd -as_diagonal_slide_computation <- function(f, ...) { +as_diagonal_slide_computation <- function(.f, ...) { as_slide_computation( - f, ..., + .f, ..., .ref_time_value_long_varnames = c(".version", ".ref_time_value"), .ref_time_value_label = "version" ) From 1ae0ef5c8a80a278cca4eeb2e6abfbc7f977e4ac Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 29 Aug 2024 12:39:51 -0700 Subject: [PATCH 070/110] Dot-prefix more args, locals; finish some incomplete renames Local variables `f`, `starts`, and `stops` are never used at the same time as arguments `.f`, `.starts`, and `.stops`. To try to prevent confusion, dot-prefix the local variables as well to show that we don't need to refer back to these args. In the case of `f`/`.f`, try to avoid confusion/issues with `group_modify`'s `.f` by renaming some things to involve a new name `.slide_comp`. Internal functions that forward `...` fed to them from the user can exhibit the same name conflict behavior as external-facing functions, so dot-prefix args there as well. Fix some incomplete renames (dot prefixes and time_value -> version) and fix some docs/messages around these renames. --- R/grouped_epi_archive.R | 46 ++++++++++++++++++++--------------------- R/methods-epi_archive.R | 26 +++++++++++++++-------- R/slide.R | 33 +++++++++++++++-------------- 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index b37c31bc..2b1fd5c3 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -288,7 +288,7 @@ epix_slide.grouped_epi_archive <- function( each slide computation came from.", "i" = "{cli::qty(length(.x$private$vars))} grouping column name{?s} {?was/were} {format_chr_with_quotes(.x$private$vars)}", - "x" = "`new_col_name` was {format_chr_with_quotes(new_col_name)}" + "x" = "`.new_col_name` was {format_chr_with_quotes(.new_col_name)}" )) } if (identical(.new_col_name, "version")) { @@ -306,23 +306,23 @@ epix_slide.grouped_epi_archive <- function( cli_abort("If `f` is missing then a computation must be specified via `...`.") } - f <- as_diagonal_slide_computation(quosures) + .slide_comp <- as_diagonal_slide_computation(quosures) # Magic value that passes zero args as dots in calls below. Equivalent to # `... <- missing_arg()`, but use `assign` to avoid warning about # improper use of dots. assign("...", missing_arg()) } else { used_data_masking <- FALSE - f <- as_diagonal_slide_computation(.f, ...) + .slide_comp <- as_diagonal_slide_computation(.f, ...) } # Computation for one group, one time value comp_one_grp <- function(.data_group, .group_key, - f, ..., - version, - new_col_name) { + .slide_comp, ..., + .version, + .new_col_name) { # Carry out the specified computation - comp_value <- f(.data_group, .group_key, version, ...) + comp_value <- .slide_comp(.data_group, .group_key, .version, ...) # If this wasn't a tidyeval computation, we still need to check the output # types. We'll let `group_modify` and `vec_rbind` deal with checking for @@ -345,9 +345,9 @@ epix_slide.grouped_epi_archive <- function( # redundant work. `group_modify()` provides the group key, we provide the # ref time value (appropriately recycled) and comp_value (appropriately # named / unpacked, for quick feedback) - res <- list(version = vctrs::vec_rep(version, vctrs::vec_size(comp_value))) + res <- list(version = vctrs::vec_rep(.version, vctrs::vec_size(comp_value))) - if (is.null(new_col_name)) { + if (is.null(.new_col_name)) { if (inherits(comp_value, "data.frame")) { # unpack into separate columns (without name prefix): res <- c(res, comp_value) @@ -356,9 +356,9 @@ epix_slide.grouped_epi_archive <- function( res[["slide_value"]] <- comp_value } } else { - # vector or packed data.frame-type column (note: new_col_name of + # vector or packed data.frame-type column (note: .new_col_name of # "version" is disallowed): - res[[new_col_name]] <- comp_value + res[[.new_col_name]] <- comp_value } # Stop on naming conflicts (names() fine here, non-NULL). Not the @@ -369,12 +369,12 @@ epix_slide.grouped_epi_archive <- function( return(validate_tibble(new_tibble(res))) } - out <- lapply(.versions, function(version) { + out <- lapply(.versions, function(.version) { # Ungrouped as-of data; `epi_df` if `all_versions` is `FALSE`, # `epi_archive` if `all_versions` is `TRUE`: as_of_raw <- .x$private$ungrouped %>% epix_as_of( - version, - min_time_value = version - .before, + .version, + min_time_value = .version - .before, all_versions = .all_versions ) @@ -409,9 +409,9 @@ epix_slide.grouped_epi_archive <- function( # Convert each subgroup chunk to an archive before running the calculation. group_modify_fn <- function(.data_group, .group_key, - f, ..., - version, - new_col_name) { + .slide_comp, ..., + .version, + .new_col_name) { # .data_group is coming from as_of_df as a tibble, but we # want to feed `comp_one_grp` an `epi_archive` backed by a # DT; convert and wrap: @@ -420,9 +420,9 @@ epix_slide.grouped_epi_archive <- function( .data_group_archive <- as_of_archive .data_group_archive$DT <- .data_group comp_one_grp(.data_group_archive, .group_key, - f = f, ..., - version = version, - new_col_name = new_col_name + .slide_comp = .slide_comp, ..., + .version = .version, + .new_col_name = .new_col_name ) } } @@ -431,9 +431,9 @@ epix_slide.grouped_epi_archive <- function( dplyr::group_modify( dplyr::group_by(as_of_df, !!!syms(.x$private$vars), .drop = .x$private$drop), group_modify_fn, - f = f, ..., - version = version, - new_col_name = .new_col_name, + .slide_comp = .slide_comp, ..., + .version = .version, + .new_col_name = .new_col_name, .keep = TRUE ) ) diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index 1471ea8a..b2b025d6 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -101,17 +101,25 @@ epix_as_of <- function(x, version, min_time_value = -Inf, all_versions = FALSE, ) } + # We can't disable nonstandard evaluation nor use the `..` feature in the `i` + # argument of `[.data.table` below; try to avoid problematic names and abort + # if we fail to do so: + .min_time_value <- min_time_value + .version <- version + if (any(c(".min_time_value", ".version") %in% names(x$DT))) { + cli_abort("epi_archives can't contain a `.min_time_value` or `.version` column") + } + # Filter by version and return if (all_versions) { # epi_archive is copied into result, so we can modify result directly result <- epix_truncate_versions_after(x, version) - result$DT <- result$DT[time_value >= min_time_value, ] # nolint: object_usage_linter + result$DT <- result$DT[time_value >= .min_time_value, ] # nolint: object_usage_linter return(result) } # Make sure to use data.table ways of filtering and selecting - .version <- version # workaround for `i` arg not supporting `..` feature - as_of_epi_df <- x$DT[time_value >= min_time_value & version <= .version, ] %>% # nolint: object_usage_linter + as_of_epi_df <- x$DT[time_value >= .min_time_value & version <= .version, ] %>% # nolint: object_usage_linter unique( by = c("geo_value", "time_value", other_keys), fromLast = TRUE @@ -658,12 +666,12 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' used for labeling the computations, which are `group_vars(x)` and #' `"version"`, then the values for these columns must be identical to the #' labels we assign. -#' @param .all_versions (Not the same as `.all_rows` parameter of `epi_slide`.) If -#' `.all_versions = TRUE`, then `.f` will be passed the version history (all -#' `version <= .ref_time_value`) for rows having `time_value` of at least -#' `.version - before`. Otherwise, `.f` will be -#' passed only the most recent `version` for every unique `time_value`. -#' Default is `FALSE`. +#' @param .all_versions (Not the same as `.all_rows` parameter of `epi_slide`.) +#' If `.all_versions = TRUE`, then the slide computation will be passed the +#' version history (all `version <= .version` where `.version` is one of the +#' requested `.versions`) for rows having a `time_value` of at least `.version +#' - before`. Otherwise, the slide computation will be passed only the most +#' recent `version` for every unique `time_value`. Default is `FALSE`. #' @return A tibble whose columns are: the grouping variables, `time_value`, #' containing the reference time values for the slide computation, and a #' column named according to the `.new_col_name` argument, containing the slide diff --git a/R/slide.R b/R/slide.R index bc879d09..62059fa1 100644 --- a/R/slide.R +++ b/R/slide.R @@ -30,7 +30,8 @@ #' contain the derivative values. The default is "slide_value" unless your #' slide computations output data frames, in which case they will be unpacked #' into the constituent columns and those names used. Note that setting -#' `new_col_name` equal to an existing column name will overwrite this column. +#' `.new_col_name` equal to an existing column name will overwrite this +#' column. #' #' @template basic-slide-details #' @@ -191,8 +192,8 @@ epi_slide <- function( .x <- arrange(.x, .data$time_value) # Now set up starts and stops for sliding/hopping - starts <- .ref_time_values - before - stops <- .ref_time_values + after + .starts <- .ref_time_values - before + .stops <- .ref_time_values + after # If `.f` is missing, interpret ... as an expression for tidy evaluation if (missing(.f)) { @@ -211,27 +212,27 @@ epi_slide <- function( used_data_masking <- FALSE } - f <- as_time_slide_computation(.f, ...) + .slide_comp <- as_time_slide_computation(.f, ...) # Create a wrapper that calculates and passes `.ref_time_value` to the - # computation. `i` is contained in the `f_wrapper_factory` environment such + # computation. `i` is contained in the `slide_comp_wrapper_factory` environment such # that when called within `slide_one_grp` `i` is reset for every group. - f_wrapper_factory <- function(kept_ref_time_values) { + slide_comp_wrapper_factory <- function(kept_ref_time_values) { # Use `i` to advance through list of start dates. i <- 1L - f_wrapper <- function(.x, .group_key, ...) { + slide_comp_wrapper <- function(.x, .group_key, ...) { .ref_time_value <- kept_ref_time_values[[i]] i <<- i + 1L - f(.x, .group_key, .ref_time_value, ...) + .slide_comp(.x, .group_key, .ref_time_value, ...) } - return(f_wrapper) + return(slide_comp_wrapper) } # Computation for one group, all time values slide_one_grp <- function(.data_group, .group_key, # see `?group_modify` ..., # `...` to `epi_slide` forwarded here - .f_factory, + .slide_comp_factory, .starts, .stops, .ref_time_values, @@ -246,7 +247,7 @@ epi_slide <- function( .stops <- .stops[o] kept_ref_time_values <- .ref_time_values[o] - f <- .f_factory(kept_ref_time_values) + .slide_comp <- .slide_comp_factory(kept_ref_time_values) # Compute the slide values slide_values_list <- slider::hop_index( @@ -254,7 +255,7 @@ epi_slide <- function( .i = .data_group$time_value, .starts = .starts, .stops = .stops, - .f = f, + .f = .slide_comp, .group_key, ... ) @@ -338,9 +339,9 @@ epi_slide <- function( .x <- group_modify(.x, slide_one_grp, ..., - .f_factory = f_wrapper_factory, - .starts = starts, - .stops = stops, + .slide_comp_factory = slide_comp_wrapper_factory, + .starts = .starts, + .stops = .stops, .ref_time_values = .ref_time_values, .all_rows = .all_rows, .new_col_name = .new_col_name, @@ -489,7 +490,7 @@ epi_slide_opt <- function( ) } - # Check that slide function `f` is one of those short-listed from + # Check that slide function `.f` is one of those short-listed from # `data.table` and `slider` (or a function that has the exact same # definition, e.g. if the function has been reexported or defined # locally). From 6854c07cf3e4a1afb465c919b9508e937a081357 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Wed, 4 Sep 2024 06:44:38 +0000 Subject: [PATCH 071/110] docs: document (GHA) --- man/epi_slide.Rd | 3 ++- man/epix_slide.Rd | 13 +++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index 950c19e3..b9fa5be6 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -73,7 +73,8 @@ underlying data table, by default.} contain the derivative values. The default is "slide_value" unless your slide computations output data frames, in which case they will be unpacked into the constituent columns and those names used. Note that setting -\code{new_col_name} equal to an existing column name will overwrite this column.} +\code{.new_col_name} equal to an existing column name will overwrite this +column.} \item{.all_rows}{If \code{.all_rows = TRUE}, then all rows of \code{.x} will be kept in the output even with \code{.ref_time_values} provided, with some type of missing diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index e71c775d..4cfaca6b 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -83,12 +83,13 @@ used for labeling the computations, which are \code{group_vars(x)} and \code{"version"}, then the values for these columns must be identical to the labels we assign.} -\item{.all_versions}{(Not the same as \code{.all_rows} parameter of \code{epi_slide}.) If -\code{.all_versions = TRUE}, then \code{.f} will be passed the version history (all -\code{version <= .ref_time_value}) for rows having \code{time_value} of at least -\code{.version - before}. Otherwise, \code{.f} will be -passed only the most recent \code{version} for every unique \code{time_value}. -Default is \code{FALSE}.} +\item{.all_versions}{(Not the same as \code{.all_rows} parameter of \code{epi_slide}.) +If \code{.all_versions = TRUE}, then the slide computation will be passed the +version history (all \code{version <= .version} where \code{.version} is one of the +requested \code{.versions}) for rows having a \code{time_value} of at least `.version +\itemize{ +\item before\verb{. Otherwise, the slide computation will be passed only the most recent }version\verb{for every unique}time_value\verb{. Default is }FALSE`. +}} \item{.ref_time_values}{Reference time values / versions for sliding computations; each element of this vector serves both as the anchor point From ef2639e08788a38ed18457b326013da6bda1c56d Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 4 Sep 2024 02:46:49 -0700 Subject: [PATCH 072/110] Dot-prefix `f` args in helper functions (& their messages) --- R/utils.R | 84 ++++++++++++++++++------------------- tests/testthat/test-utils.R | 10 ++--- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/R/utils.R b/R/utils.R index 79f2e96d..a7fd2f18 100644 --- a/R/utils.R +++ b/R/utils.R @@ -132,10 +132,10 @@ format_chr_with_quotes <- function(x, empty = "*none*") { #' @importFrom utils tail #' #' @noRd -assert_sufficient_f_args <- function(f, ..., .ref_time_value_label) { +assert_sufficient_f_args <- function(.f, ..., .ref_time_value_label) { mandatory_f_args_labels <- c("window data", "group key", .ref_time_value_label) n_mandatory_f_args <- length(mandatory_f_args_labels) - args <- formals(args(f)) + args <- formals(args(.f)) args_names <- names(args) # Remove named arguments forwarded from `epi[x]_slide`'s `...`: forwarded_dots_names <- names(rlang::call_match(dots_expand = FALSE)[["..."]]) @@ -149,7 +149,7 @@ assert_sufficient_f_args <- function(f, ..., .ref_time_value_label) { dots_i <- which(remaining_args_names == "...") # integer(0) if no match n_f_args_before_dots <- dots_i - 1L if (length(dots_i) != 0L) { - # `f` has a dots "arg" + # `.f` has a dots "arg" # Keep all arg names before `...` mandatory_args_mapped_names <- remaining_args_names[seq_len(n_f_args_before_dots)] # nolint: object_usage_linter @@ -158,40 +158,40 @@ assert_sufficient_f_args <- function(f, ..., .ref_time_value_label) { tail(mandatory_f_args_labels, n_mandatory_f_args - n_f_args_before_dots) cli::cli_warn( - "`f` might not have enough positional arguments before its `...`; in + "`.f` might not have enough positional arguments before its `...`; in the current `epi[x]_slide` call, the {mandatory_f_args_in_f_dots} will - be included in `f`'s `...`; if `f` doesn't expect those arguments, it + be included in `.f`'s `...`; if `.f` doesn't expect those arguments, it may produce confusing error messages", class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots", - epiprocess__f = f, + epiprocess__f = .f, epiprocess__mandatory_f_args_in_f_dots = mandatory_f_args_in_f_dots ) } - } else { # `f` doesn't have a dots "arg" + } else { # `.f` doesn't have a dots "arg" if (length(args_names) < n_mandatory_f_args + rlang::dots_n(...)) { - # `f` doesn't take enough args. + # `.f` doesn't take enough args. if (rlang::dots_n(...) == 0L) { # common case; try for friendlier error message - cli_abort("`f` must take at least {n_mandatory_f_args} arguments", + cli_abort("`.f` must take at least {n_mandatory_f_args} arguments", class = "epiprocess__assert_sufficient_f_args__f_needs_min_args", - epiprocess__f = f + epiprocess__f = .f ) } else { # less common; highlight that they are (accidentally?) using dots forwarding cli_abort( - "`f` must take at least {n_mandatory_f_args} arguments plus the + "`.f` must take at least {n_mandatory_f_args} arguments plus the {rlang::dots_n(...)} arguments forwarded through `epi[x]_slide`'s `...`, or a named argument to `epi[x]_slide` was misspelled", class = "epiprocess__assert_sufficient_f_args__f_needs_min_args_plus_forwarded", - epiprocess__f = f + epiprocess__f = .f ) } } } # Check for args with defaults that are filled with mandatory positional - # calling args. If `f` has fewer than n_mandatory_f_args before `...`, then we + # calling args. If `.f` has fewer than n_mandatory_f_args before `...`, then we # only need to check those args for defaults. Note that `n_f_args_before_dots` is - # length 0 if `f` doesn't accept `...`. + # length 0 if `.f` doesn't accept `...`. n_remaining_args_for_default_check <- min(c(n_f_args_before_dots, n_mandatory_f_args)) default_check_args <- remaining_args[seq_len(n_remaining_args_for_default_check)] default_check_args_names <- names(default_check_args) @@ -199,18 +199,18 @@ assert_sufficient_f_args <- function(f, ..., .ref_time_value_label) { if (any(has_default_replaced_by_mandatory)) { default_check_mandatory_args_labels <- mandatory_f_args_labels[seq_len(n_remaining_args_for_default_check)] - # ^ excludes any mandatory args absorbed by f's `...`'s: + # ^ excludes any mandatory args absorbed by .f's `...`'s: mandatory_args_replacing_defaults <- default_check_mandatory_args_labels[has_default_replaced_by_mandatory] # nolint: object_usage_linter args_with_default_replaced_by_mandatory <- rlang::syms(default_check_args_names[has_default_replaced_by_mandatory]) # nolint: object_usage_linter cli::cli_abort( "`epi[x]_slide` would pass the {mandatory_args_replacing_defaults} to - `f`'s {args_with_default_replaced_by_mandatory} argument{?s}, which - {?has a/have} default value{?s}; we suspect that `f` doesn't expect + `.f`'s {args_with_default_replaced_by_mandatory} argument{?s}, which + {?has a/have} default value{?s}; we suspect that `.f` doesn't expect {?this arg/these args} at all and may produce confusing error messages. - Please add additional arguments to `f` or remove defaults as + Please add additional arguments to `.f` or remove defaults as appropriate.", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults", - epiprocess__f = f + epiprocess__f = .f ) } } @@ -330,14 +330,14 @@ assert_sufficient_f_args <- function(f, ..., .ref_time_value_label) { #' f_rhs is_formula caller_arg caller_env #' #' @noRd -as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_time_value_label) { - arg <- caller_arg(f) +as_slide_computation <- function(.f, ..., .ref_time_value_long_varnames, .ref_time_value_label) { + arg <- caller_arg(.f) call <- caller_env() - if (rlang::is_quosures(f)) { - quosures <- rlang::quos_auto_name(f) # resolves := among other things + if (rlang::is_quosures(.f)) { + quosures <- rlang::quos_auto_name(.f) # resolves := among other things nms <- names(quosures) - manually_named <- rlang::names2(f) != "" | vapply(f, function(quosure) { + manually_named <- rlang::names2(.f) != "" | vapply(.f, function(quosure) { expression <- rlang::quo_get_expr(quosure) is.call(expression) && expression[[1L]] == rlang::sym(":=") }, FUN.VALUE = logical(1L)) @@ -363,7 +363,7 @@ as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_tim # seems like it would exclude `NULL` bindings for us but `?new_tibble` # doesn't reflect this behavior). results_multiorder <- character(0L) - for (quosure_i in seq_along(f)) { + for (quosure_i in seq_along(.f)) { # XXX could capture and improve error messages here at cost of recover()ability quosure_result_raw <- rlang::eval_tidy(quosures[[quosure_i]], data_mask) if (is.null(quosure_result_raw)) { @@ -407,7 +407,7 @@ as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_tim } else { cli_abort(" Problem with output of {.code - {rlang::expr_deparse(rlang::quo_get_expr(f[[quosure_i]]))}}; it + {rlang::expr_deparse(rlang::quo_get_expr(.f[[quosure_i]]))}}; it produced a result that was neither NULL, a data.frame, nor a vector without unnamed entries (as determined by the vctrs package). ", class = "epiprocess__invalid_slide_comp_tidyeval_output") @@ -424,21 +424,21 @@ as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_tim return(fn) } - if (is_function(f)) { - # Check that `f` takes enough args - assert_sufficient_f_args(f, ..., .ref_time_value_label = .ref_time_value_label) - return(f) + if (is_function(.f)) { + # Check that `.f` takes enough args + assert_sufficient_f_args(.f, ..., .ref_time_value_label = .ref_time_value_label) + return(.f) } - if (is_formula(f)) { - if (is_quosure(f)) { - cli_abort("`f` argument to `as_slide_computation()` cannot be a `quosure`; it should probably be a `quosures`. This is likely an internal bug in `{{epiprocess}}`.") # nolint: line_length_linter + if (is_formula(.f)) { + if (is_quosure(.f)) { + cli_abort("`.f` argument to `as_slide_computation()` cannot be a `quosure`; it should probably be a `quosures`. This is likely an internal bug in `{{epiprocess}}`.") # nolint: line_length_linter } - if (length(f) > 2) { + if (length(.f) > 2) { cli_abort("{.code {arg}} must be a one-sided formula", class = "epiprocess__as_slide_computation__formula_is_twosided", - epiprocess__f = f, + epiprocess__f = .f, call = call ) } @@ -448,16 +448,16 @@ as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_tim are unrecognized/misspelled parameter names, or there is a trailing comma in the `epi[x]_slide()` call.", class = "epiprocess__as_slide_computation__formula_with_dots", - epiprocess__f = f, + epiprocess__f = .f, epiprocess__enquos_dots = enquos(...) ) } - env <- f_env(f) + env <- f_env(.f) if (!is_environment(env)) { cli_abort("Formula must carry an environment.", class = "epiprocess__as_slide_computation__formula_has_no_env", - epiprocess__f = f, + epiprocess__f = .f, epiprocess__f_env = env, arg = arg, call = call ) @@ -474,18 +474,18 @@ as_slide_computation <- function(f, ..., .ref_time_value_long_varnames, .ref_tim .ref_time_value_long_varnames ) ) - fn <- new_function(args, f_rhs(f), env) + fn <- new_function(args, f_rhs(.f), env) fn <- structure(fn, class = c("epiprocess_formula_slide_computation", "function")) return(fn) } cli_abort( - "Can't convert an object of class {format_class_vec(class(f))} + "Can't convert an object of class {format_class_vec(class(.f))} to a slide computation", class = "epiprocess__as_slide_computation__cant_convert_catchall", - epiprocess__f = f, - epiprocess__f_class = class(f), + epiprocess__f = .f, + epiprocess__f_class = class(.f), arg = arg, call = call ) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index b84c1e4a..f3cd743e 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -137,11 +137,11 @@ test_that("assert_sufficient_f_args alerts if the provided f has defaults for th f_x_dots <- function(x = 1, ...) dplyr::tibble(value = mean(x$binary), count = length(x$binary)) expect_error(assert_sufficient_f_args(f_xgt, .ref_time_value_label = "reference time value"), - regexp = "pass the group key to `f`'s g argument,", + regexp = "pass the group key to `\\.f`'s g argument,", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) expect_error(assert_sufficient_f_args(f_xgt_dots, .ref_time_value_label = "reference time value"), - regexp = "pass the window data to `f`'s x argument,", + regexp = "pass the window data to `\\.f`'s x argument,", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) expect_error(suppressWarnings(assert_sufficient_f_args(f_x_dots, .ref_time_value_label = "reference time value")), @@ -156,7 +156,7 @@ test_that("assert_sufficient_f_args alerts if the provided f has defaults for th expect_no_error(assert_sufficient_f_args(f_xsgt, setting = "b", .ref_time_value_label = "reference time value")) expect_no_error(assert_sufficient_f_args(f_xsgt_dots, setting = "b", .ref_time_value_label = "reference time value")) expect_error(suppressWarnings(assert_sufficient_f_args(f_xs_dots, setting = "b", .ref_time_value_label = "reference time value")), - regexp = "pass the window data to `f`'s x argument", + regexp = "pass the window data to `\\.f`'s x argument", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) @@ -181,7 +181,7 @@ test_that("assert_sufficient_f_args alerts if the provided f has defaults for th assert_sufficient_f_args(f_xs_dots, .ref_time_value_label = "reference time value"), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ), - regexp = "window data and group key to `f`'s x and setting argument", + regexp = "window data and group key to `\\.f`'s x and setting argument", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) }) @@ -223,7 +223,7 @@ test_that("as_slide_computation raises errors as expected", { class = "epiprocess__as_slide_computation__formula_has_no_env" ) - # `f` must be a function, formula, or string + # `.f` must be a function, formula, or string expect_error(as_time_slide_computation(5), class = "epiprocess__as_slide_computation__cant_convert_catchall" ) From 9aafabb905750c2a0b9e68eb8331bd499e5e9e65 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 4 Sep 2024 03:40:57 -0700 Subject: [PATCH 073/110] WIP output column de-duping in epix_slide --- R/grouped_epi_archive.R | 72 ++++++++++++++++++++++---------- tests/testthat/test-epix_slide.R | 7 ++++ 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 2b1fd5c3..24b29395 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -342,29 +342,58 @@ epix_slide.grouped_epi_archive <- function( } # Construct result first as list, then tibble-ify, to try to avoid some - # redundant work. `group_modify()` provides the group key, we provide the - # ref time value (appropriately recycled) and comp_value (appropriately - # named / unpacked, for quick feedback) - res <- list(version = vctrs::vec_rep(.version, vctrs::vec_size(comp_value))) + # redundant work. However, we will sacrifice some performance here doing + # checks here in the inner loop, in order to provide immediate feedback on + # some formatting errors. + # res <- list(version = vctrs::vec_rep(.version, vctrs::vec_size(comp_value))) + res <- c( + list(), # get list output; a bit faster than `as.list()`-ing `.group_key` + .group_key, + list(version = .version) + ) + res <- vctrs::vec_recycle_common(!!!res, .size = vctrs::vec_size(comp_value)) if (is.null(.new_col_name)) { if (inherits(comp_value, "data.frame")) { - # unpack into separate columns (without name prefix): - res <- c(res, comp_value) + # Sometimes comp_value can parrot back columns already in `res`; allow + # this, but balk if a column has the same name as one in `res` but a + # different value: + comp_nms <- names(comp_value) + overlaps_label_names <- comp_nms %in% names(res) + for (comp_i in which(overlaps_label_names)) { + if (!identical(comp_value[[comp_i]], res[[comp_nms[[comp_i]]]])) { + lines <- c( + cli::format_error(c( + "conflict detected between slide value computation labels and output:", + "i" = "we are labeling slide computations with the following columns: {syms(names(res))}", + "x" = "a slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't match the label" + )), + capture.output(print(waldo::compare(res[[comp_nms[[comp_i]]]], comp_value[[comp_i]], x_arg = "label", y_arg = "comp output"))), + cli::format_message(c("You likely want to rename or remove this column in your output, or debug why it has a different value.")) + ) + rlang::abort(paste(collapse = "\n", lines), + class = "epiprocess__epix_slide_label_vs_output_column_conflict") + } + } + # Unpack into separate columns (without name prefix). If there are + # columns duplicating label columns, de-dupe and order them as if they + # didn't exist in comp_value. + res <- c(res, comp_value[!overlaps_label_names]) } else { - # apply default name (to vector or packed data.frame-type column): + # Apply default name (to vector or packed data.frame-type column): res[["slide_value"]] <- comp_value + # TODO check for bizarre conflicting `slide_value` label col name. + # Either here or on entry to `epix_slide` (even if there we don't know + # whether vecs will be output). Or just turn this into a special case of + # the preceding branch and let the checking code there generate a + # complaint. } } else { - # vector or packed data.frame-type column (note: .new_col_name of - # "version" is disallowed): + # vector or packed data.frame-type column (note: overlaps with label + # column names should already be forbidden by earlier validation): res[[.new_col_name]] <- comp_value } - # Stop on naming conflicts (names() fine here, non-NULL). Not the - # friendliest error messages though. - vctrs::vec_as_names(names(res), repair = "check_unique") - # Fast conversion: return(validate_tibble(new_tibble(res))) } @@ -380,18 +409,19 @@ epix_slide.grouped_epi_archive <- function( # Set: # * `as_of_df`, the data.frame/tibble/epi_df/etc. that we will - # `group_modify` as the `.data` argument. Might or might not + # `group_map` as the `.data` argument. Might or might not # include version column. - # * `group_modify_fn`, the corresponding `.f` argument + # * `group_map_fn`, the corresponding `.f` argument for `group_map` + # (not our `.f`) if (!.all_versions) { as_of_df <- as_of_raw - group_modify_fn <- comp_one_grp + group_map_fn <- comp_one_grp } else { as_of_archive <- as_of_raw # We essentially want to `group_modify` the archive, but # haven't implemented this method yet. Next best would be # `group_modify` on its `$DT`, but that has different - # behavior based on whether or not `dtplyr` is loaded. + # behavior based on whether or not `dtplyr` < 1.3.0 is loaded. # Instead, go through an ordinary data frame, trying to avoid # copies. if (address(as_of_archive$DT) == address(.x$private$ungrouped$DT)) { @@ -408,7 +438,7 @@ epix_slide.grouped_epi_archive <- function( data.table::setDF(as_of_df) # Convert each subgroup chunk to an archive before running the calculation. - group_modify_fn <- function(.data_group, .group_key, + group_map_fn <- function(.data_group, .group_key, .slide_comp, ..., .version, .new_col_name) { @@ -428,14 +458,14 @@ epix_slide.grouped_epi_archive <- function( } return( - dplyr::group_modify( + dplyr::bind_rows(dplyr::group_map( dplyr::group_by(as_of_df, !!!syms(.x$private$vars), .drop = .x$private$drop), - group_modify_fn, + group_map_fn, .slide_comp = .slide_comp, ..., .version = .version, .new_col_name = .new_col_name, .keep = TRUE - ) + )) ) }) # Combine output into a single tibble (allowing for packed columns) diff --git a/tests/testthat/test-epix_slide.R b/tests/testthat/test-epix_slide.R index 179d9427..a2758878 100644 --- a/tests/testthat/test-epix_slide.R +++ b/tests/testthat/test-epix_slide.R @@ -770,3 +770,10 @@ test_that("`epix_slide` works with .before = Inf", { pull(sum_binary) ) }) + +test_that("`epix_slide` de-dupes labeling & value columns", { + expect_identical(xx %>% epix_slide(version = .version), + xx$DT %>% as.data.frame() %>% as_tibble() %>% distinct(version) %>% arrange(version)) + expect_error(xx %>% epix_slide(version = .version + 1)) + # FIXME more tests +}) From e4637140913e02b0561c2c1e4cb7904c868ac086 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Wed, 4 Sep 2024 10:44:26 +0000 Subject: [PATCH 074/110] style: styler (GHA) --- R/grouped_epi_archive.R | 15 ++++++++------- tests/testthat/test-epix_slide.R | 6 ++++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 24b29395..9e9f06a1 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -364,15 +364,16 @@ epix_slide.grouped_epi_archive <- function( if (!identical(comp_value[[comp_i]], res[[comp_nms[[comp_i]]]])) { lines <- c( cli::format_error(c( - "conflict detected between slide value computation labels and output:", - "i" = "we are labeling slide computations with the following columns: {syms(names(res))}", - "x" = "a slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't match the label" + "conflict detected between slide value computation labels and output:", + "i" = "we are labeling slide computations with the following columns: {syms(names(res))}", + "x" = "a slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't match the label" )), capture.output(print(waldo::compare(res[[comp_nms[[comp_i]]]], comp_value[[comp_i]], x_arg = "label", y_arg = "comp output"))), cli::format_message(c("You likely want to rename or remove this column in your output, or debug why it has a different value.")) ) rlang::abort(paste(collapse = "\n", lines), - class = "epiprocess__epix_slide_label_vs_output_column_conflict") + class = "epiprocess__epix_slide_label_vs_output_column_conflict" + ) } } # Unpack into separate columns (without name prefix). If there are @@ -439,9 +440,9 @@ epix_slide.grouped_epi_archive <- function( # Convert each subgroup chunk to an archive before running the calculation. group_map_fn <- function(.data_group, .group_key, - .slide_comp, ..., - .version, - .new_col_name) { + .slide_comp, ..., + .version, + .new_col_name) { # .data_group is coming from as_of_df as a tibble, but we # want to feed `comp_one_grp` an `epi_archive` backed by a # DT; convert and wrap: diff --git a/tests/testthat/test-epix_slide.R b/tests/testthat/test-epix_slide.R index a2758878..3589ed77 100644 --- a/tests/testthat/test-epix_slide.R +++ b/tests/testthat/test-epix_slide.R @@ -772,8 +772,10 @@ test_that("`epix_slide` works with .before = Inf", { }) test_that("`epix_slide` de-dupes labeling & value columns", { - expect_identical(xx %>% epix_slide(version = .version), - xx$DT %>% as.data.frame() %>% as_tibble() %>% distinct(version) %>% arrange(version)) + expect_identical( + xx %>% epix_slide(version = .version), + xx$DT %>% as.data.frame() %>% as_tibble() %>% distinct(version) %>% arrange(version) + ) expect_error(xx %>% epix_slide(version = .version + 1)) # FIXME more tests }) From 8973eddd2c5cd41f3003bd9e1f5c20592357651a Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 4 Sep 2024 23:23:45 -0700 Subject: [PATCH 075/110] Add missing dot prefixes in some messages --- R/slide.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/slide.R b/R/slide.R index 62059fa1..86ae63b5 100644 --- a/R/slide.R +++ b/R/slide.R @@ -127,7 +127,7 @@ epi_slide <- function( assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) if (!test_subset(.ref_time_values, unique(.x$time_value))) { cli_abort( - "`ref_time_values` must be a unique subset of the time values in `x`.", + "`.ref_time_values` must be a unique subset of the time values in `.x`.", class = "epi_slide__invalid_ref_time_values" ) } From e039a402830285b28d121ad5b77680de9e37cd5d Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 5 Sep 2024 13:50:38 -0700 Subject: [PATCH 076/110] Fix empty-version grouped slide behavior change, tweak warning Moving from `group_modify` to `group_map` means doing our own labeling. Handle a corner case here in a way similar to `group_modify` (if you think of `version` being a non-dropping factor at the beginning of the grouping columns). It's not clear this behavior is what we want... perhaps we want to generate errors if we ever have NAs generated from this not-a-nondropping-factor version/grouping-column following a nondropping-factor version/grouping-column. Or at least warn in the subcase of this when a user requests an empty version when `.drop = TRUE` or `.drop = FALSE` but there are nonfactor columns. Tweak the `.drop = FALSE` warning that tries to ward against some of the above cases (but is only thinking about grouping columns rather than version + grouping columns) so that it won't warn if there are 0 grouping columns. It makes sense that a user may have a set of potential factor grouping columns and programmatically try models with different grouping column sets and `.drop = FALSE`, including an empty grouping column set. --- R/archive.R | 8 ++++---- R/grouped_epi_archive.R | 19 +++++++++++++++++-- tests/testthat/test-grouped_epi_archive.R | 4 +--- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/R/archive.R b/R/archive.R index 5cf55ff6..07394d9d 100644 --- a/R/archive.R +++ b/R/archive.R @@ -693,9 +693,9 @@ group_by.epi_archive <- function(.data, ..., .add = FALSE, grouping_cols <- as.list(detailed_mutate[["archive"]][["DT"]])[detailed_mutate[["request_names"]]] grouping_col_is_factor <- purrr::map_lgl(grouping_cols, is.factor) # ^ Use `as.list` to try to avoid any possibility of a deep copy. - if (!any(grouping_col_is_factor)) { + if (length(grouping_cols) != 0L && !any(grouping_col_is_factor)) { cli_warn( - "`.drop=FALSE` but there are no factor grouping columns; + "`.drop=FALSE` but none of the grouping columns are factors; did you mean to convert one of the columns to a factor beforehand?", class = "epiprocess__group_by_epi_archive__drop_FALSE_no_factors" ) @@ -703,10 +703,10 @@ group_by.epi_archive <- function(.data, ..., .add = FALSE, cli_warn( "`.drop=FALSE` but there are one or more non-factor grouping columns listed after a factor grouping column; this may produce groups with `NA`s for these - columns; see https://github.com/tidyverse/dplyr/issues/5369#issuecomment-683762553; + non-factor columns; see https://github.com/tidyverse/dplyr/issues/5369#issuecomment-683762553; depending on how you want completion to work, you might instead want to convert all grouping columns to factors beforehand, specify the non-factor grouping columns first, - or use `.drop=TRUE` and add a call to `tidyr::complete`.", + or use `.drop=TRUE` and add a call to `tidyr::complete()`.", class = "epiprocess__group_by_epi_archive__drop_FALSE_nonfactor_after_factor" ) } diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 9e9f06a1..47b9fdaa 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -341,14 +341,29 @@ epix_slide.grouped_epi_archive <- function( ", class = "epiprocess__invalid_slide_comp_value") } + .group_key_label <- if (nrow(.group_key) == 0L) { + # Edge case: we'll get here if a requested `.version` had 0 rows and we + # grouped by a nonzero number of columns using the default `.drop = TRUE` + # (or on all non-factor columns with `.drop = FALSE` for some reason, + # probably a user bug). Mimicking `dplyr`, we'll let `.group_key` provided + # to the computation be 0 rows, but then label it using NAs. (In the + # bizarre situation of grouping by a mix of factor and non-factor with + # `.drop = FALSE`, `.group_key` will already have 1 row. For ungrouped + # epix_slides and 0-variable-grouped epix_slides with either `.drop` + # setting, we will have a 1x0 .group_key, although perhaps for the latter + # this should be 0x0.) + vctrs::vec_cast(NA, .group_key) + } else { + .group_key + } + # Construct result first as list, then tibble-ify, to try to avoid some # redundant work. However, we will sacrifice some performance here doing # checks here in the inner loop, in order to provide immediate feedback on # some formatting errors. - # res <- list(version = vctrs::vec_rep(.version, vctrs::vec_size(comp_value))) res <- c( list(), # get list output; a bit faster than `as.list()`-ing `.group_key` - .group_key, + .group_key_label, list(version = .version) ) res <- vctrs::vec_recycle_common(!!!res, .size = vctrs::vec_size(comp_value)) diff --git a/tests/testthat/test-grouped_epi_archive.R b/tests/testthat/test-grouped_epi_archive.R index 1e953d6f..8ed5ea02 100644 --- a/tests/testthat/test-grouped_epi_archive.R +++ b/tests/testthat/test-grouped_epi_archive.R @@ -37,9 +37,7 @@ test_that("Grouping, regrouping, and ungrouping archives works as intended", { expect_error(toy_archive %>% group_by(.drop = "bogus"), regexp = "Must be of type 'logical', not 'character'" ) - expect_warning(toy_archive %>% group_by(.drop = FALSE), - class = "epiprocess__group_by_epi_archive__drop_FALSE_no_factors" - ) + expect_no_warning(toy_archive %>% group_by(.drop = FALSE)) expect_warning(toy_archive %>% group_by(geo_value, .drop = FALSE), class = "epiprocess__group_by_epi_archive__drop_FALSE_no_factors" ) From dd5c769be51b5f41e7d3099ec7b5842648668305 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 23 Aug 2024 18:54:03 -0700 Subject: [PATCH 077/110] feat: refactor epi_slide * works with grouped epi_dfs only * add .complete_only parameter * correct deprecation messages * add huge amounts of tests * add aggregate_epi_df * single data point per group epi_df now defaults to day time type --- NAMESPACE | 1 + R/epi_df.R | 22 +- R/grouped_epi_archive.R | 7 +- R/methods-epi_df.R | 33 + R/slide.R | 373 +++++---- R/utils.R | 21 +- man/aggregate_epi_df.Rd | 23 + man/epi_slide.Rd | 11 +- tests/testthat/test-archive.R | 2 +- tests/testthat/test-epi_slide.R | 1050 ++++++++++++-------------- tests/testthat/test-methods-epi_df.R | 18 + 11 files changed, 817 insertions(+), 744 deletions(-) create mode 100644 man/aggregate_epi_df.Rd diff --git a/NAMESPACE b/NAMESPACE index fc6aaf74..1e94cbf3 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -45,6 +45,7 @@ S3method(ungroup,epi_df) S3method(ungroup,grouped_epi_archive) S3method(unnest,epi_df) export("%>%") +export(aggregate_epi_df) export(archive_cases_dv_subset) export(arrange) export(arrange_canonical) diff --git a/R/epi_df.R b/R/epi_df.R index fedcff55..f525d9db 100644 --- a/R/epi_df.R +++ b/R/epi_df.R @@ -245,10 +245,10 @@ as_epi_df.tbl_df <- function( ) } if (lifecycle::is_present(geo_type)) { - cli_warn("epi_archive constructor argument `geo_type` is now ignored. Consider removing.") + cli_warn("epi_df constructor argument `geo_type` is now ignored. Consider removing.") } if (lifecycle::is_present(time_type)) { - cli_warn("epi_archive constructor argument `time_type` is now ignored. Consider removing.") + cli_warn("epi_df constructor argument `time_type` is now ignored. Consider removing.") } # If geo type is missing, then try to guess it @@ -277,6 +277,20 @@ as_epi_df.tbl_df <- function( } assert_character(other_keys) + + # Check one time_value per group + duplicated_time_values <- x %>% + group_by(across(all_of(c("geo_value", "time_value", other_keys)))) %>% + dplyr::summarize(n = dplyr::n(), .groups = "drop") %>% + filter(n > 1) + if (nrow(duplicated_time_values) > 0) { + bad_data <- capture.output(duplicated_time_values) + cli_abort( + "as_epi_df: some groups in the data have duplicated time values. epi_df requires a unique time_value per group.", + body = c("Sample groups:", bad_data) + ) + } + new_epi_df(x, geo_type, time_type, as_of, other_keys) } @@ -309,3 +323,7 @@ as_epi_df.tbl_ts <- function(x, as_of, other_keys = character(), ...) { is_epi_df <- function(x) { inherits(x, "epi_df") } + +group_epi_df <- function(x) { + x %>% group_by(group_by(across(all_of(kill_time_value(key_colnames(.)))))) +} diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 9e9279fc..a8eef106 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -270,11 +270,14 @@ epix_slide.grouped_epi_archive <- function( ref_time_values <- sort(.ref_time_values) } - validate_slide_window_arg(.before, .x$private$ungrouped$time_type) + validate_slide_window_arg(.before, .x$private$ungrouped$time_type, lower = 0) # nolint: object_usage_linter checkmate::assert_string(.new_col_name, null.ok = TRUE) if (identical(.new_col_name, "time_value")) { - cli_abort('`new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation') # nolint: line_length_linter + cli_abort( + '`new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name + to attach the `ref_time_value` associated with each slide computation' + ) } assert_logical(.all_versions, len = 1L) diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index 4e74fd1c..83e0a089 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -383,3 +383,36 @@ arrange_canonical.epi_df <- function(x, ...) { dplyr::relocate(dplyr::all_of(keys), .before = 1) %>% dplyr::arrange(dplyr::across(dplyr::all_of(keys))) } + +#' Aggregate an `epi_df` object +#' +#' Aggregates an `epi_df` object by the specified group columns, summing the +#' `value` column, and returning an `epi_df`. If aggregating over `geo_value`, +#' the resulting `epi_df` will have `geo_value` set to `"total"`. +#' +#' @param .x an `epi_df` +#' @param value_col character name of the column to aggregate +#' @param group_cols character vector of column names to group by +#' @return an `epi_df` object +#' +#' @export +aggregate_epi_df <- function(.x, value_col = "value", group_cols = "time_value") { + assert_class(.x, "epi_df") + assert_character(value_col, len = 1) + assert_character(group_cols) + checkmate::assert_subset(value_col, names(.x)) + checkmate::assert_subset(group_cols, names(.x)) + + .x %>% + group_by(across(all_of(group_cols))) %>% + dplyr::summarize(!!(value_col) := sum(!!sym(value_col))) %>% + ungroup() %>% + { + if (!"geo_value" %in% group_cols) { + mutate(., geo_value = "total") %>% relocate(geo_value, .before = 1) + } else { + . + } + } %>% + as_epi_df(as_of = attr(.x, "metadata")$as_of) +} diff --git a/R/slide.R b/R/slide.R index 1128e453..375d4326 100644 --- a/R/slide.R +++ b/R/slide.R @@ -34,6 +34,11 @@ #' @param .new_col_name String indicating the name of the new column that will #' contain the derivative values. Default is "slide_value"; note that setting #' `new_col_name` equal to an existing column name will overwrite this column. +#' @param .complete_only Logical; if `TRUE`, only slide values that have a +#' complete window of `before` and `after` values are returned. If `FALSE`, the +#' function `f` may be given a reduced window size, commonly at the beginning +#' of the time series, but also possibly in the interior if the `time_value` +#' column has gaps (see `complete.epi_df` to address the latter). #' #' @template basic-slide-details #' @@ -86,8 +91,8 @@ #' ungroup() epi_slide <- function( .x, .f, ..., - .window_size = 1, .align = c("right", "center", "left"), - .ref_time_values = NULL, .new_col_name = NULL, .all_rows = FALSE) { + .window_size = NULL, .align = c("right", "center", "left"), + .ref_time_values = NULL, .new_col_name = NULL, .all_rows = FALSE, .complete_only = FALSE) { # Deprecated argument handling provided_args <- rlang::call_args_names(rlang::call_match()) if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "f", "ref_time_values", "new_col_name", "all_rows")))) { @@ -116,9 +121,23 @@ epi_slide <- function( ) } - # Function body starts + # Validate arguments assert_class(.x, "epi_df") - assert_class(.x, "grouped_df") + if (checkmate::test_class(.x, "grouped_df")) { + expected_group_keys <- .x %>% + key_colnames() %>% + kill_time_value() %>% + sort() + if (.x %>% groups() %>% as.character() %>% sort() != expected_group_keys) { + cli_abort( + "epi_slide: `.x` must be either ungrouped or grouped by {expected_group_keys}. You may need to aggregate + your data first, see aggregate_epi_df().", + class = "epi_slide__invalid_grouping" + ) + } + } else { + .x <- group_epi_df(.x) + } if (nrow(.x) == 0L) { return(.x) @@ -127,60 +146,27 @@ epi_slide <- function( if (is.null(.ref_time_values)) { .ref_time_values <- unique(.x$time_value) } else { - assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE) + assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE, unique = TRUE) if (!test_subset(.ref_time_values, unique(.x$time_value))) { cli_abort( - "`ref_time_values` must be a unique subset of the time values in `x`.", - class = "epi_slide__invalid_ref_time_values" - ) - } - - if (anyDuplicated(.ref_time_values) != 0L) { - cli_abort( - "`.ref_time_values` must not contain any duplicates; use `unique` if appropriate.", + "epi_slide: `ref_time_values` must be a unique subset of the time values in `x`.", class = "epi_slide__invalid_ref_time_values" ) } } .ref_time_values <- sort(.ref_time_values) - # Handle window arguments align <- rlang::arg_match(.align) time_type <- attr(.x, "metadata")$time_type - validate_slide_window_arg(.window_size, time_type) - if (identical(.window_size, Inf)) { - if (align == "right") { - before <- Inf - if (time_type %in% c("day", "week")) { - after <- as.difftime(0, units = glue::glue("{time_type}s")) - } else { - after <- 0 - } + if (is.null(.window_size)) { + if (time_type == "week") { + .window_size <- as.difftime(1, units = "weeks") } else { - cli_abort( - "`epi_slide`: center and left alignment are not supported with an infinite window size." - ) - } - } else { - if (align == "right") { - before <- .window_size - 1 - after <- 0 - } else if (align == "center") { - # For .window_size = 5, before = 2, after = 2. For .window_size = 4, before = 2, after = 1. - before <- floor(.window_size / 2) - after <- .window_size - before - 1 - } else if (align == "left") { - before <- 0 - after <- .window_size - 1 + .window_size <- 1 } } - - # Arrange by increasing time_value - x <- arrange(.x, .data$time_value) - - # Now set up starts and stops for sliding/hopping - starts <- .ref_time_values - before - stops <- .ref_time_values + after + validate_slide_window_arg(.window_size, time_type) + window_args <- get_before_after_from_window(.window_size, align, time_type) # If `f` is missing, interpret ... as an expression for tidy evaluation if (missing(.f)) { @@ -192,20 +178,26 @@ epi_slide <- function( .f <- quosures # Magic value that passes zero args as dots in calls below. Equivalent to - # `... <- missing_arg()`, but use `assign` to avoid warning about - # improper use of dots. + # `... <- missing_arg()`, but `assign` avoids warning about improper use of + # dots. assign("...", missing_arg()) } else { used_data_masking <- FALSE } - f <- as_slide_computation(.f, ...) + assert_logical(.complete_only, len = 1) + if (identical(.window_size, Inf) && .complete_only) { + cli_abort( + "epi_slide: `complete_only` is not supported with an infinite window size." + ) + } + # Create a wrapper that calculates and passes `.ref_time_value` to the - # computation. `i` is contained in the `f_wrapper_factory` environment such - # that when called within `slide_one_grp` `i` is reset for every group. + # computation. `i` is contained in the `f_wrapper_factory` environment so when + # it is called in `slide_one_grp`, `i` advances through the list of reference + # time values within a group and then resets back to 1 when switching groups. f_wrapper_factory <- function(kept_ref_time_values) { - # Use `i` to advance through list of start dates. i <- 1L f_wrapper <- function(.x, .group_key, ...) { .ref_time_value <- kept_ref_time_values[[i]] @@ -214,129 +206,198 @@ epi_slide <- function( } return(f_wrapper) } + epi_slide_one_group_partial <- function(.data_group, .group_key, ...) { + epi_slide_one_group( + .data_group, .group_key, ..., + f_factory = f_wrapper_factory, + before = window_args$before, + after = window_args$after, + ref_time_values = .ref_time_values, + all_rows = .all_rows, + new_col_name = .new_col_name, + used_data_masking = used_data_masking, + time_type = time_type, + complete_only = .complete_only + ) + } - # Computation for one group, all time values - slide_one_grp <- function(.data_group, - .group_key, # see `?group_modify` - ..., # `...` to `epi_slide` forwarded here - f_factory, - starts, - stops, - ref_time_values, - all_rows, - new_col_name) { - # Figure out which reference time values appear in the data group in the - # first place (we need to do this because it could differ based on the - # group, hence the setup/checks for the reference time values based on all - # the data could still be off): - o <- ref_time_values %in% .data_group$time_value - starts <- starts[o] - stops <- stops[o] - kept_ref_time_values <- ref_time_values[o] - - f <- f_factory(kept_ref_time_values) - - # Compute the slide values - slide_values_list <- slider::hop_index( - .x = .data_group, - .i = .data_group$time_value, - .starts = starts, - .stops = stops, - .f = f, - .group_key, ... + # If .x is not grouped, then the trivial group is applied: https://dplyr.tidyverse.org/reference/group_map.html + # `...` from top of `epi_slide` are forwarded to `.f` here. + + # If every group takes the length(available_ref_time_values) == 0 branch in + # epi_slide_one_group, then we end up in a situation where the result as no + # new columns at all. This is a very fragile solution, I might even just + # remove it and error instead. + result <- group_modify(.x, epi_slide_one_group_partial, ..., .keep = FALSE) + if (ncol(result) == ncol(.x)) { + cli_warn( + "epi_slide: no new columns were created. This can happen if every group has no available ref_time_values. + In this case we return your epi_df but with an all-NA column 'slide_value' or what you provided in + `.new_col_name`. If your computation returned data.frames you may not get the expected column names.", + class = "epiprocess__epi_slide_no_new_columns" ) - # If this wasn't a tidyeval computation, we still need to check the output - # types. We'll let `list_unchop` deal with checking for type compatibility - # between the outputs. - if (!used_data_masking && - !all(vapply(slide_values_list, function(comp_value) { - # vctrs considers data.frames to be vectors, but we still check - # separately for them because certain base operations output data frames - # with rownames, which we will allow (but might drop) - is.data.frame(comp_value) || - vctrs::obj_is_vector(comp_value) && is.null(vctrs::vec_names(comp_value)) - }, logical(1L))) - ) { - cli_abort(" - the slide computations must always return either data frames without rownames - or unnamed vectors (as determined by the vctrs package) (and not a mix - of these two structures). - ", class = "epiprocess__invalid_slide_comp_value") + if (is.null(.new_col_name)) { + result <- mutate(result, slide_value = NA) + } else { + result <- mutate(result, !!.new_col_name := NA) } + } + return(result) +} - # Now figure out which rows in the data group are in the reference time - # values; this will be useful for all sorts of checks that follow - o <- .data_group$time_value %in% kept_ref_time_values - num_ref_rows <- sum(o) +# Slide applied to one group. See `?group_modify` for the expected structure. The dots +# `...` forward their inputs to the function `f`. +epi_slide_one_group <- function( + .data_group, .group_key, + ..., + f_factory, before, after, ref_time_values, all_rows, new_col_name, used_data_masking, time_type, complete_only) { + if (complete_only) { + # Filter out any ref_time_values that don't have a complete window. + available_ref_time_values <- ref_time_values %>% purrr::keep(function(rtv) { + .data_group %>% + filter(rtv - before <= time_value & time_value <= rtv + after) %>% + nrow() == before + after + 1 + }) + } else { + # Which of the ref time values are available in this group? + available_ref_time_values <- ref_time_values[ref_time_values %in% .data_group$time_value] + } - # Count the number of appearances of each kept reference time value. - counts <- dplyr::filter(.data_group, .data$time_value %in% kept_ref_time_values) %>% - dplyr::count(.data$time_value) %>% - `[[`("n") + # If the data group does not contain any of the reference time values, return + # the original .data_group without slide columns and let bind_rows at the end + # of group_modify handle filling the empty data frame with NA values. + if (length(available_ref_time_values) == 0L) { + if (all_rows) { + if (complete_only) { + return(.data_group %>% filter(min(time_value) + before <= time_value & time_value <= max(time_value) - after)) + } else { + return(.data_group) + } + } + return(.data_group %>% filter(FALSE)) + } - slide_values <- vctrs::list_unchop(slide_values_list) + # Get stateful function that tracks ref_time_value per group and sends it to + # `f` when called. + f <- f_factory(available_ref_time_values) + if (time_type == "yearmonth" && identical(before, Inf)) { + starts <- rep(-Inf, length(available_ref_time_values)) + stops <- available_ref_time_values + after + } else { + starts <- available_ref_time_values - before + stops <- available_ref_time_values + after + } + + # Compute the slide values. slider::hop_index will return a list of f outputs + # e.g. list(f(.slide_group_1, .group_key, .ref_time_value_1), + # f(.slide_group_1, .group_key, .ref_time_value_2), ...) + slide_values_list <- slider::hop_index( + .x = .data_group, + .i = .data_group$time_value, + .starts = starts, + .stops = stops, + .f = f, + .group_key, ... + ) - if ( - all(purrr::map_int(slide_values_list, vctrs::vec_size) == 1L) && - length(slide_values_list) != 0L - ) { - # Recycle to make size stable (one slide value per ref time value). - # (Length-0 case also could be handled here, but causes difficulties; - # leave it to the next branch, where it also belongs.) - slide_values <- vctrs::vec_rep_each(slide_values, times = counts) + # Validate returned values. + return_types <- purrr::map_chr(slide_values_list, function(x) { + if (is.data.frame(x)) { + return("data.frame") + } else if (vctrs::obj_is_vector(x) && is.null(vctrs::vec_names(x))) { + return("vector") } else { - # (Loose) check on number of rows: - if (vctrs::vec_size(slide_values) != num_ref_rows) { - cli_abort( - "The slide computations must either (a) output a single element/row each, or - (b) one element/row per appearance of the reference time value in the local window." - ) - } + return("other") } + }) %>% unique() + # Returned values must be data.frame or vector. + if ("other" %in% return_types) { + cli_abort( + "epi_slide: slide computations must always return either data frames without rownames + or unnamed vectors (as determined by the vctrs package).", + class = "epiprocess__invalid_slide_comp_value" + ) + } + # Returned values must all be the same type. + if (length(return_types) != 1L) { + cli_abort( + "epi_slide: slide computations must always return either a data.frame or a vector (as determined by the + vctrs package), but not a mix of the two.", + class = "epiprocess__invalid_slide_comp_value" + ) + } + # Returned values must always be a scalar vector or a data frame with one row. + if (all(vctrs::list_sizes(slide_values_list) != 1L)) { + cli_abort( + "The slide computations must either (a) output a single element/row each or + (b) one element/row per appearance of the reference time value in the local window.", + class = "epiprocess__invalid_slide_comp_value" + ) + } + # Flatten the output list. This will also error if the user's slide function + # returned inconsistent types. + slide_values <- slide_values_list %>% vctrs::list_unchop() - # If all rows, then pad slide values with NAs, else filter down data group - if (all_rows) { - orig_values <- slide_values - slide_values <- vctrs::vec_rep(vctrs::vec_cast(NA, orig_values), nrow(.data_group)) - vctrs::vec_slice(slide_values, o) <- orig_values + # If all rows, then pad slide values with NAs, else filter down data group + if (all_rows) { + if (complete_only) { + # Modify the .data_group so that we ignore the time values on the edges. + .data_group <- .data_group %>% + filter(min(time_value) + before <= time_value & time_value <= max(time_value) - after) + } + orig_values <- slide_values + slide_values <- vctrs::vec_rep(vctrs::vec_cast(NA, orig_values), nrow(.data_group)) + vctrs::vec_slice(slide_values, .data_group$time_value %in% available_ref_time_values) <- orig_values + } else { + .data_group <- .data_group %>% filter(time_value %in% available_ref_time_values) + } + + result <- + if (is.null(new_col_name) && inherits(slide_values, "data.frame")) { + # Unpack into separate columns (without name prefix). If there are + # re-bindings, the last one wins for determining column value & placement. + mutate(.data_group, slide_values) + } else if (is.null(new_col_name) && !inherits(slide_values, "data.frame")) { + # Unpack into default name "slide_value". + mutate(.data_group, slide_value = slide_values) } else { - .data_group <- filter(.data_group, o) + # Unpack vector into given name or a packed data.frame-type column. + mutate(.data_group, !!new_col_name := slide_values) } - result <- - if (is.null(new_col_name)) { - if (inherits(slide_values, "data.frame")) { - # unpack into separate columns (without name prefix) and, if there are - # re-bindings, make the last one win for determining column value & - # column placement: - mutate(.data_group, slide_values) - } else { - # apply default name: - mutate(.data_group, slide_value = slide_values) - } + return(result) +} + +get_before_after_from_window <- function(window_size, align, time_type) { + if (identical(window_size, Inf)) { + if (align == "right") { + before <- Inf + if (time_type %in% c("day", "week")) { + after <- as.difftime(0, units = glue::glue("{time_type}s")) } else { - # vector or packed data.frame-type column: - mutate(.data_group, !!new_col_name := slide_values) + after <- 0 } - - return(result) + } else { + cli_abort( + "`epi_slide`: center and left alignment are not supported with an infinite window size." + ) + } + } else { + if (align == "right") { + before <- window_size - 1 + after <- 0 + } else if (align == "center") { + # For window_size = 5, before = 2, after = 2. For window_size = 4, before = 2, after = 1. + before <- floor(window_size / 2) + after <- window_size - before - 1 + } else if (align == "left") { + before <- 0 + after <- window_size - 1 + } } - - x <- group_modify(x, slide_one_grp, - ..., - f_factory = f_wrapper_factory, - starts = starts, - stops = stops, - ref_time_values = .ref_time_values, - all_rows = .all_rows, - new_col_name = .new_col_name, - .keep = FALSE - ) - - - return(x) + return(list(before = before, after = after)) } #' Optimized slide function for performing common rolling computations on an diff --git a/R/utils.R b/R/utils.R index 9c47594d..066bbe9c 100644 --- a/R/utils.R +++ b/R/utils.R @@ -475,11 +475,13 @@ guess_time_type <- function(time_value, time_value_arg = rlang::caller_arg(time_ if (inherits(time_value, "Date")) { unique_time_gaps <- as.numeric(diff(sort(unique(time_value)))) # Gaps in a weekly date sequence will cause some diffs to be larger than 7 - # days, so check modulo 7 equality, rather than equality with 7. - if (all(unique_time_gaps %% 7 == 0)) { + # days, so check modulo 7 equality, rather than equality with 7. The length + # check is there so that we don't classify epi_df with a single data point + # per geo as "week". + if (all(unique_time_gaps %% 7 == 0) && length(unique_time_gaps) > 0) { return("week") } - if (all(unique_time_gaps >= 28)) { + if (all(unique_time_gaps >= 28) && length(unique_time_gaps) > 0) { cli_abort( "Found a monthly or longer cadence in the time column `{time_value_arg}`. Consider using tsibble::yearmonth for monthly data and 'YYYY' integers for year data." @@ -875,17 +877,10 @@ guess_period.POSIXt <- function(time_values, time_values_arg = rlang::caller_arg as.numeric(NextMethod(), units = "secs") } -validate_slide_window_arg <- function(arg, time_type, allow_inf = TRUE, arg_name = rlang::caller_arg(arg)) { - if (is.null(arg)) { +validate_slide_window_arg <- function(arg, time_type, lower = 1, allow_inf = TRUE, arg_name = rlang::caller_arg(arg)) { + if (!checkmate::test_scalar(arg) || arg < lower) { cli_abort( - "`{arg_name}` is a required argument for slide functions.", - class = "epiprocess__validate_slide_window_arg" - ) - } - - if (!checkmate::test_scalar(arg)) { - cli_abort( - "Slide function expected `{arg_name}` to be a scalar value.", + "Slide function expected `{arg_name}` to be a non-null, scalar integer >= {lower}.", class = "epiprocess__validate_slide_window_arg" ) } diff --git a/man/aggregate_epi_df.Rd b/man/aggregate_epi_df.Rd new file mode 100644 index 00000000..702aec84 --- /dev/null +++ b/man/aggregate_epi_df.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods-epi_df.R +\name{aggregate_epi_df} +\alias{aggregate_epi_df} +\title{Aggregate an \code{epi_df} object} +\usage{ +aggregate_epi_df(.x, value_col = "value", group_cols = "time_value") +} +\arguments{ +\item{.x}{an \code{epi_df}} + +\item{value_col}{character name of the column to aggregate} + +\item{group_cols}{character vector of column names to group by} +} +\value{ +an \code{epi_df} object +} +\description{ +Aggregates an \code{epi_df} object by the specified group columns, summing the +\code{value} column, and returning an \code{epi_df}. If aggregating over \code{geo_value}, +the resulting \code{epi_df} will have \code{geo_value} set to \code{"total"}. +} diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index 23bb5217..4450e496 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -8,11 +8,12 @@ epi_slide( .x, .f, ..., - .window_size = 1, + .window_size = NULL, .align = c("right", "center", "left"), .ref_time_values = NULL, .new_col_name = NULL, - .all_rows = FALSE + .all_rows = FALSE, + .complete_only = FALSE ) } \arguments{ @@ -85,6 +86,12 @@ outside \code{.ref_time_values}; otherwise, there will be one row for each row i \code{.x} that had a \code{time_value} in \code{.ref_time_values}. Default is \code{FALSE}. The missing value marker is the result of \code{vctrs::vec_cast}ing \code{NA} to the type of the slide computation output.} + +\item{.complete_only}{Logical; if \code{TRUE}, only slide values that have a +complete window of \code{before} and \code{after} values are returned. If \code{FALSE}, the +function \code{f} may be given a reduced window size, commonly at the beginning +of the time series, but also possibly in the interior if the \code{time_value} +column has gaps (see \code{complete.epi_df} to address the latter).} } \value{ An \code{epi_df} object given by appending one or more new columns to \code{.x}, diff --git a/tests/testthat/test-archive.R b/tests/testthat/test-archive.R index 1791d870..51c94139 100644 --- a/tests/testthat/test-archive.R +++ b/tests/testthat/test-archive.R @@ -159,7 +159,7 @@ test_that("epi_archives are correctly instantiated with a variety of data types" # Keyed epi_df edf2 <- data.frame( - geo_value = "al", + geo_value = c(rep("al", 10), rep("ak", 10)), time_value = rep(d + 0:9, 2), version = c( rep(as.Date("2020-01-25"), 10), diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 08738252..be684a62 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -1,357 +1,500 @@ library(cli) library(dplyr) +library(purrr) -test_date <- as.Date("2020-01-01") -days_dt <- as.difftime(1, units = "days") -weeks_dt <- as.difftime(1, units = "weeks") - -n <- 30 -# A tibble with two geos on the same time index and one geo with a different but -# overlapping time index -toy_edf <- tibble::tribble( - ~geo_value, ~time_value, ~value, - "a", test_date + 1:n, 1:n, - "b", test_date + 1:n, 10 * n + 1:n, - "c", test_date + floor(n / 2) + 1:n, 100 * n + 1:n -) %>% - tidyr::unnest_longer(c(time_value, value)) %>% - as_epi_df(as_of = test_date + 100) -toy_edf_g <- toy_edf %>% group_by(geo_value) -overlap_index <- toy_edf %>% - group_by(geo_value) %>% - summarize(time_values = list(time_value)) %>% - pull(time_values) %>% - Reduce(intersect, .) %>% - as.Date() - -# Utility functions for computing expected slide_sum output -compute_slide_external <- function(.window_size, overlap = FALSE) { - if (overlap) { - toy_edf <- toy_edf %>% - filter(time_value %in% overlap_index) - toy_edf_g <- toy_edf_g %>% - filter(time_value %in% overlap_index) - } - slide_value <- toy_edf %>% - group_by(time_value) %>% - summarize(value = sum(.data$value)) %>% - pull(.data$value) %>% - slider::slide_sum(before = .window_size - 1) - toy_edf_g %>% - mutate(slide_value = slide_value) %>% - ungroup() +num_rows_per_group <- 20 +get_test_date <- function(time_type = "day") { + switch(time_type, + day = as.Date("2020-01-01"), + week = as.Date("2020-01-01"), + yearmonth = tsibble::make_yearmonth(year = 2022, month = 1), + integer = 2022L + ) } -compute_slide_external_g <- function(.window_size) { - toy_edf_g %>% - mutate(slide_value = slider::slide_sum(.data$value, before = .window_size - 1)) %>% - dplyr::arrange(geo_value, time_value) %>% - as_epi_df(as_of = test_date + 100) +get_test_units <- function(time_type = "day") { + switch(time_type, + day = as.difftime(1, units = "days"), + week = as.difftime(1, units = "weeks"), + yearmonth = 1, + integer = 1 + ) } +get_test_dataset <- function(n, time_type = "day", other_keys = character()) { + checkmate::assert_integerish(n, lower = 1) + checkmate::assert_character(time_type) + checkmate::assert_character(other_keys) + checkmate::assert_subset(other_keys, "x") + # Do this to actually get n rows per group. + n_ <- n - 1 + + test_date <- get_test_date(time_type) + units <- get_test_units(time_type) + # A tibble with two geos on the same time index and one geo with a different + # but overlapping time index. Each geo has a missing value somewhere in the middle. + tibble::tribble( + ~geo_value, ~time_value, ~value, ~x, + "a", test_date + units * 0:n_, 0:n_, rep(c(1, 2), length.out = n), + "b", test_date + units * 0:n_, 10 * n + 0:n_, rep(c(1, 2), length.out = n), + "c", test_date + units * (floor(n / 2) + 0:n_), 100 * n + 0:n_, rep(c(1, 2), length.out = n) + ) %>% + tidyr::unnest_longer(c(time_value, value, x)) %>% + slice(-10) %>% + as_epi_df(as_of = test_date + n, other_keys = other_keys) %>% + group_by(geo_value) +} +test_data <- get_test_dataset(num_rows_per_group, "day") -f_tib_avg_count <- function(x, g, t) dplyr::tibble(avg = mean(x$value), count = length(x$value)) +# TODO: Add a test that uses an 'other_key' grouping column. +epi_slide_sum_test <- function( + .x, + .window_size = 1, .align = "right", .ref_time_values = NULL, .all_rows = FALSE, .complete_only = FALSE) { + time_type <- attr(.x, "metadata")$time_type + window_args <- get_before_after_from_window(.window_size, .align, time_type) + .x %>% + mutate( + slide_value = slider::slide_index_sum( + .data$value, + .data$time_value, + before = window_args$before, + after = window_args$after, + complete = .complete_only + ) + ) %>% + # If .all_rows = TRUE, we need to keep all rows and NA out the ones not in + # the ref_time_values. Otherwise, we need to return only the rows in + # ref_time_values. + group_modify(~ { + if (is.null(.ref_time_values)) { + .ref_time_values <- unique(.$time_value) + } + if (.complete_only) { + # Filter out any ref_time_values that don't have a complete window. + available_ref_time_values <- purrr::keep(.ref_time_values, function(rtv) { + filter(., rtv - window_args$before <= time_value & time_value <= rtv + window_args$after) %>% + nrow() == window_args$before + window_args$after + 1 + }) + } else { + # Which of the ref time values are available in this group? + available_ref_time_values <- .ref_time_values[.ref_time_values %in% .$time_value] + } -# Argument validation tests -bad_values <- list( - "a", 0.5, -1L, -1.5, 1.5, NA, c(0, 1) + if (.all_rows) { + . <- dplyr::mutate(., slide_value = dplyr::if_else(time_value %in% available_ref_time_values, slide_value, NA)) + if (.complete_only) { + filter( + ., + min(time_value) + window_args$before <= time_value & time_value <= max(time_value) - window_args$after + ) + } else { + . + } + } else { + dplyr::filter(., time_value %in% available_ref_time_values) + } + }) +} +concatenate_list_params <- function(p) { + paste(paste0(names(p), "=", p), collapse = "\n") +} +vec_equal_reasonable <- function(x, y) { + if (is.null(x) && is.null(y)) { + return(TRUE) + } else if (is.null(x) && !is.null(y)) { + return(FALSE) + } else if (!is.null(x) && is.null(y)) { + return(FALSE) + } else if (length(x) != length(y)) { + return(FALSE) + } + all(x == y) +} + + +# Massive amounts of basic functionality tests across an exhaustive combination +# of parameters. +param_combinations <- bind_rows( + tidyr::expand_grid( + .time_type = c("day", "week", "yearmonth", "integer"), + .align = c("right", "center", "left"), + .window_size = c(1, 7), + # .ref_time_values can be: + # - NULL is a special case where we just use all the unique time_values in the + # data. + # - c(1, 2) correspond to test_date + 1 * units and test_date + 2 * units. + # This is outside the time_value index for group c and is close to the left + # edge for a and b, so if .complete_only is TRUE, there output should be + # either empty or NA (depending if .all_rows is TRUE or not), otherwise if + # .complete_only is FALSE, only the a and b groups should have values. + # - c(8) corresponds to test_date + 8 * units. In this case, groups a and b + # have values, but c does not. + .ref_time_values = list(NULL, c(1, 2), c(8, 9)), + .complete_only = c(FALSE, TRUE), + .all_rows = c(FALSE, TRUE), + ), + tidyr::expand_grid( + .time_type = c("day", "week", "yearmonth", "integer"), + .align = c("right"), + .window_size = c(Inf), + .ref_time_values = list(NULL, c(1, 2), c(8, 9)), + .complete_only = c(FALSE), + .all_rows = c(FALSE, TRUE), + ) ) -purrr::walk(bad_values, function(bad_value) { +for (p in (param_combinations %>% transpose())) { + test_data <- get_test_dataset(num_rows_per_group, p$.time_type) + units <- get_test_units(p$.time_type) + test_date <- get_test_date(p$.time_type) + p$.window_size <- p$.window_size * units + if (!is.null(p$.ref_time_values)) { + p$.ref_time_values <- test_date + units * p$.ref_time_values + } + slide_args <- p[-which(names(p) %in% c(".time_type"))] + as_of <- attr(test_data, "metadata")$as_of + simple_epi_slide_call <- function(.f) { + if ( + vec_equal_reasonable(p$.ref_time_values, c(test_date + 1 * units, test_date + 2 * units)) && + p$.complete_only && + as.numeric(p$.window_size) == 7 && + p$.align != "left" + ) { + expect_warning( + out <- rlang::inject(epi_slide(test_data, .f, !!!slide_args)), + class = "epiprocess__epi_slide_no_new_columns" + ) + } else { + out <- rlang::inject(epi_slide(test_data, .f, !!!slide_args)) + } + out + } + expect_equal_mod <- function(x, y) { + # This branch occurs if .all_rows = FALSE and the ref_time_values have no + # overlaps with the data. In this case, our test function will also return + # an empty df, but with slightly different types. + if (nrow(x) == 0 && nrow(y) == 0) { + expect_equal(names(x), names(y)) + # This branch occurs if .all_rows = TRUE and the ref_time_values have no + # overlaps with the data. In this case epi_slide codes the NA vector as + # logical and epi_slide_sum_test codes it as double. + } else if (all(is.na(x$slide_value)) || all(is.na(y$slide_value))) { + expect_equal(names(x), names(y)) + expect_equal(x %>% select(-slide_value), y %>% select(-slide_value)) + } else { + expect_equal(x, y) + } + } + expected_out <- rlang::inject(epi_slide_sum_test(test_data, !!!slide_args)) + test_that( - format_inline("`.window_size` fails on {bad_value}"), + format_inline( + "epi_slide works with formulas.:\n", + concatenate_list_params(p) + ), { - expect_error( - epi_slide(toy_edf_g, .window_size = bad_value, .ref_time_values = test_date + 2), - class = "epiprocess__validate_slide_window_arg" + expect_equal_mod( + simple_epi_slide_call(~ sum(.x$value)), + expected_out ) } ) -}) -purrr::walk(bad_values, function(bad_value) { - test_that(format_inline("`.window_size` in epi_slide_mean fails on {bad_value}"), { - expect_error( - epi_slide_mean(toy_edf_g, .col_names = value, .window_size = bad_value, .ref_time_values = test_date + 2), - class = "epiprocess__validate_slide_window_arg" - ) - }) -}) -bad_values <- c(min(toy_edf_g$time_value) - 1, max(toy_edf_g$time_value) + 1) -purrr::walk(bad_values, function(bad_value) { - test_that(format_inline("epi_slide[_mean]: `.ref_time_values` out of range for all groups {bad_value}"), { - expect_error( - epi_slide(toy_edf_g, f_tib_avg_count, .window_size = 2 * days_dt, .ref_time_values = bad_value), - class = "epi_slide__invalid_ref_time_values" - ) - expect_error( - epi_slide_mean(toy_edf_g, .col_names = value, .window_size = 2 * days_dt, .ref_time_values = bad_value), - class = "epi_slide_opt__invalid_ref_time_values" - ) - }) -}) - -test_that( - "epi_slide or epi_slide_mean: `.ref_time_values` in range for at least one group generate no error", - { - expect_equal( - epi_slide(toy_edf_g, ~ sum(.x$value), .window_size = 2 * days_dt, .ref_time_values = test_date + 5) %>% ungroup(), - compute_slide_external_g(.window_size = 2) %>% ungroup() %>% filter(time_value == test_date + 5) - ) - expect_equal( - epi_slide_sum(toy_edf_g, value, .window_size = 2 * days_dt, .ref_time_values = test_date + 5, na.rm = TRUE) %>% - ungroup() %>% - rename(slide_value = slide_value_value), - compute_slide_external_g(.window_size = 2) %>% ungroup() %>% filter(time_value == test_date + 5) - ) - } -) + test_that( + format_inline( + "epi_slide works with data.frame outputs. Params:\n", + concatenate_list_params(p) + ), + { + expect_equal_mod( + simple_epi_slide_call(~ data.frame(slide_value = sum(.x$value))), + expected_out + ) + } + ) -test_that("epi_slide alerts if the provided f doesn't take enough args", { - expect_no_error( - epi_slide(toy_edf_g, f_tib_avg_count, .window_size = days_dt, .ref_time_values = test_date + 1), + test_that( + format_inline( + "epi_slide works with list outputs. Params:\n", + concatenate_list_params(p) + ), + { + expect_equal_mod( + simple_epi_slide_call(~ list(sum(.x$value))), + expected_out %>% + rowwise() %>% + mutate( + slide_value = if_else(!is.na(slide_value), list(slide_value), list(NULL)) + ) %>% + ungroup() %>% + as_epi_df(as_of = as_of) %>% + group_by(geo_value) + ) + } ) - expect_no_warning( - epi_slide(toy_edf_g, f_tib_avg_count, .window_size = days_dt, .ref_time_values = test_date + 1), + + test_that( + format_inline( + "epi_slide works with list data.frame outputs. Params:\n", + concatenate_list_params(p) + ), + { + expect_equal_mod( + simple_epi_slide_call(~ list(data.frame(slide_value = sum(.x$value)))), + expected_out %>% + rowwise() %>% + mutate( + slide_value = if_else(!is.na(slide_value), list(data.frame(slide_value = slide_value)), list(NULL)) + ) %>% + ungroup() %>% + as_epi_df(as_of = as_of) %>% + group_by(geo_value) + ) + } ) - f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$value), count = length(x$value)) - expect_warning(epi_slide(toy_edf_g, f_x_dots, .window_size = days_dt, .ref_time_values = test_date + 1), - class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" + test_that( + format_inline( + "epi_slide works with tibble list outputs. Params:\n", + concatenate_list_params(p) + ), + { + expect_equal_mod( + simple_epi_slide_call(~ tibble(slide_value = list(sum(.x$value)))), + expected_out %>% + ungroup() %>% + rowwise() %>% + mutate( + slide_value = if_else(!is.na(slide_value), list(slide_value), list(NULL)) + ) %>% + ungroup() %>% + as_epi_df(as_of = as_of) %>% + group_by(geo_value) + ) + } ) -}) + test_that( + format_inline( + "epi_slide works with unnamed data-masking data.frame. Params:\n", + concatenate_list_params(p) + ), + { + # unfortunately, we can't pass this directly as `f` and need an extra comma + if ( + vec_equal_reasonable(p$.ref_time_values, c(test_date + 1 * units, test_date + 2 * units)) && + p$.complete_only && + as.numeric(p$.window_size) == 7 && + p$.align != "left" + ) { + expect_warning( + out <- rlang::inject(epi_slide(test_data, , data.frame(slide_value = sum(.x$value)), !!!slide_args)), + class = "epiprocess__epi_slide_no_new_columns" + ) + } else { + out <- rlang::inject(epi_slide(test_data, , data.frame(slide_value = sum(.x$value)), !!!slide_args)) + } + expect_equal_mod( + out, + expected_out + ) + } + ) -# Common example tests: epi_slide over grouped epi_dfs on common ref_time_values -# TODO: doesn't work on non-overlapping ref_time_values -for (all_rows in list(FALSE, TRUE)) { - for (rtv in list(NULL, overlap_index[1:3])) { + # These are the consistency tests between epi_slide and epi_slide_opt + # functions. Only the specific case of .complete_only = FALSE and the opt + # functions using na.rm = TRUE is testsed (the two options are equivalent for + # our purposes here). + # TODO: See if we can include the .complete_only = TRUE case in the future. + # TODO: Add a case where the data contains NA values (not just gaps in time_value). + if (!p$.complete_only) { + opt_slide_args <- p[-which(names(p) %in% c(".complete_only", ".time_type"))] test_that( format_inline( - "epi_slide works with formulas, lists, and data.frame outputs with ref_time_value={rtv} - and all_rows={all_rows}" + "epi_slide and epi_slide_opt/sum/mean consistency test. Params:\n", + concatenate_list_params(p) ), { - simpler_slide_call <- function(f) { - toy_edf_g %>% - epi_slide(f, .window_size = 6 * days_dt, .ref_time_values = rtv, .all_rows = all_rows) - } - filter_expected <- function(x) { - if (all_rows && !is.null(rtv)) { - dplyr::mutate(x, slide_value = dplyr::if_else(time_value %in% rtv, slide_value, NA)) - } else if (!is.null(rtv)) { - dplyr::filter(x, time_value %in% rtv) - } else { - x - } + if ( + vec_equal_reasonable(p$.ref_time_values, c(test_date + 1 * units, test_date + 2 * units)) && + p$.complete_only && + as.numeric(p$.window_size) == 7 && + p$.align != "left" + ) { + expect_warning( + { + out_sum <- rlang::inject(epi_slide(test_data, ~ sum(.x$value), !!!opt_slide_args)) + out_mean <- rlang::inject(epi_slide(test_data, ~ mean(.x$value), !!!opt_slide_args)) + }, + class = "epiprocess__epi_slide_no_new_columns" + ) + } else { + out_sum <- rlang::inject(epi_slide(test_data, ~ sum(.x$value), !!!opt_slide_args)) %>% + rename(slide_value_value = slide_value) + out_mean <- rlang::inject(epi_slide(test_data, ~ mean(.x$value), !!!opt_slide_args)) %>% + rename(slide_value_value = slide_value) } expect_equal( - simpler_slide_call(~ sum(.x$value)), - compute_slide_external_g(.window_size = 6) %>% filter_expected() + out_sum, + rlang::inject(epi_slide_opt(test_data, value, .f = data.table::frollsum, !!!opt_slide_args, na.rm = TRUE)) ) - expect_equal( - simpler_slide_call(~ list(rep(sum(.x$value), 2L))), - compute_slide_external_g(.window_size = 6) %>% - mutate(slide_value = lapply(slide_value, rep, 2L)) %>% - filter_expected() + out_sum, + rlang::inject(epi_slide_opt(test_data, value, .f = slider::slide_sum, !!!opt_slide_args, na_rm = TRUE)) ) - expect_equal( - simpler_slide_call(~ data.frame(slide_value = sum(.x$value))), - compute_slide_external_g(.window_size = 6) %>% filter_expected() + out_sum, + rlang::inject(epi_slide_sum(test_data, value, !!!opt_slide_args, na.rm = TRUE)) ) - expect_equal( - simpler_slide_call(~ list(data.frame(slide_value = sum(.x$value)))), - compute_slide_external_g(.window_size = 6) %>% - mutate(slide_value = purrr::map(slide_value, ~ data.frame(slide_value = .x))) %>% - filter_expected() - ) - - expect_identical( - simpler_slide_call(~ tibble(slide_value = list(sum(.x$value)))), - compute_slide_external_g(.window_size = 6) %>% - mutate(slide_value = as.list(slide_value)) %>% - filter_expected() + out_mean, + rlang::inject(epi_slide_opt(test_data, value, .f = data.table::frollmean, !!!opt_slide_args, na.rm = TRUE)) ) - - # unnamed data-masking expression producing data frame: - # unfortunately, we can't pass this directly as `f` and need an extra comma - slide_unnamed_df <- toy_edf_g %>% - epi_slide( - .window_size = 6L, , data.frame(slide_value = sum(.x$value)), - .ref_time_values = rtv, .all_rows = all_rows - ) - expect_identical( - slide_unnamed_df, - compute_slide_external_g(.window_size = 6) %>% filter_expected() + expect_equal( + out_mean, + rlang::inject(epi_slide_opt(test_data, value, .f = slider::slide_mean, !!!opt_slide_args, na_rm = TRUE)) ) - } - ) - } -} - -# Common example tests: epi_slide_sum over grouped epi_dfs on common ref_time_values -# TODO: doesn't work on non-overlapping ref_time_values for most of these -for (all_rows in list(FALSE, TRUE)) { - for (rtv in list(NULL, overlap_index)) { - test_that( - format_inline( - "epi_slide_sum works with formulas, lists, and data.frame outputs with .ref_time_value={rtv} - and .all_rows={all_rows}" - ), - { - filter_expected <- function(x) { - if (all_rows && !is.null(rtv)) { - dplyr::mutate(x, slide_value = dplyr::if_else(time_value %in% rtv, slide_value, NA)) - } else if (!is.null(rtv)) { - dplyr::filter(x, time_value %in% rtv) - } else { - x - } - } - expect_equal( - toy_edf_g %>% - epi_slide_sum( - value, - .window_size = 6 * days_dt, .ref_time_values = rtv, .all_rows = all_rows, na.rm = TRUE - ) %>% - rename(slide_value = slide_value_value), - compute_slide_external_g(.window_size = 6) %>% filter_expected() + out_mean, + rlang::inject(epi_slide_mean(test_data, value, !!!opt_slide_args, na.rm = TRUE)) ) } ) } } -possible_f <- list(~.ref_time_value, ~.z, ~..3, f = function(x, g, t) t) -purrr::walk(possible_f, function(f) { - test_that("epi_slide computation can use ref_time_value", { - # Grouped with multiple geos - expect_equal( - toy_edf_g %>% epi_slide(f, .window_size = 50 * days_dt), - toy_edf_g %>% mutate(slide_value = time_value) - ) +bad_values <- list( + "a", 0.5, -1L, -1.5, 1.5, NA, c(0, 1) +) +for (bad_value in bad_values) { + test_that( + format_inline("`.window_size` fails on {bad_value}"), + { + expect_error( + epi_slide(test_data, .window_size = bad_value), + class = "epiprocess__validate_slide_window_arg" + ) + expect_error( + epi_slide_mean(test_data, .col_names = value, .window_size = bad_value), + class = "epiprocess__validate_slide_window_arg" + ) + } + ) +} - # Ungrouped with multiple geos - expect_equal( - toy_edf %>% epi_slide(f, .window_size = 50 * days_dt), - toy_edf %>% mutate(slide_value = time_value) %>% arrange(time_value) - ) - }) +test_that(format_inline("epi_slide should fail when `.ref_time_values` is out of range for all groups "), { + bad_values <- c(min(test_data$time_value) - 1, max(test_data$time_value) + 1) + expect_error( + epi_slide(test_data, ~ sum(.x), .ref_time_values = bad_values), + class = "epi_slide__invalid_ref_time_values" + ) + expect_error( + epi_slide_mean(test_data, .col_names = value, .ref_time_values = bad_values), + class = "epi_slide_opt__invalid_ref_time_values" + ) }) -test_that("epi_slide computation via dots can use ref_time_value and group", { - # Use ref_time_value - expect_equal( - toy_edf_g %>% epi_slide(slide_value = .ref_time_value, .window_size = 50 * days_dt), - toy_edf_g %>% mutate(slide_value = time_value) +test_that("epi_slide alerts if the provided f doesn't take enough args", { + f_tib_avg_count <- function(x, g, t) dplyr::tibble(avg = mean(x$value), count = length(x$value)) + expect_no_error( + epi_slide(test_data, f_tib_avg_count), + ) + expect_no_warning( + epi_slide(test_data, f_tib_avg_count), ) - # `.{x,group_key,ref_time_value}` should be inaccessible from `.data` and - # `.env`. - expect_error(toy_edf_g %>% - epi_slide( - slide_value = .env$.ref_time_value, - .window_size = 50 * days_dt - )) + f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$value), count = length(x$value)) + expect_warning(epi_slide(test_data, f_x_dots), + class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" + ) +}) - # Grouped and use group key as value +test_that("epi_slide computation via f can use ref_time_value", { + expected_out <- test_data %>% mutate(slide_value = time_value) expect_equal( - toy_edf_g %>% epi_slide(slide_value = .group_key$geo_value, .window_size = 2 * days_dt), - toy_edf_g %>% mutate(slide_value = geo_value) + test_data %>% epi_slide(~.ref_time_value), + expected_out ) - - # Use entire group_key object expect_equal( - toy_edf_g %>% epi_slide(.window_size = 2 * days_dt, slide_value = nrow(.group_key)), - toy_edf_g %>% mutate(slide_value = 1L) + test_data %>% epi_slide(~.z), + expected_out + ) + expect_equal( + test_data %>% epi_slide(~..3), + expected_out ) - - # Ungrouped with multiple geos expect_equal( - toy_edf %>% epi_slide(.window_size = 50 * days_dt, slide_value = .ref_time_value), - toy_edf %>% mutate(slide_value = time_value) %>% arrange(time_value) + test_data %>% epi_slide(.f = function(x, g, t) t), + expected_out ) }) -test_that("epi_slide computation via dots outputs the same result using col names and the data var", { - expected_output <- toy_edf %>% - epi_slide( - .window_size = 2 * days_dt, - slide_value = max(time_value) - ) %>% - as_epi_df(as_of = test_date + 6) - - result1 <- toy_edf %>% - epi_slide( - .window_size = 2 * days_dt, - slide_value = max(.x$time_value) - ) - - expect_equal(result1, expected_output) - - result2 <- toy_edf %>% - epi_slide( - .window_size = 2 * days_dt, - slide_value = max(.data$time_value) - ) - - expect_equal(result2, expected_output) +test_that("epi_slide computation via f can use group", { + expected_out <- test_data %>% mutate(slide_value = geo_value) + expect_equal( + test_data %>% epi_slide(~ .group_key$geo_value), + expected_out + ) + expect_equal( + test_data %>% epi_slide(~ .y$geo_value), + expected_out + ) + expect_equal( + test_data %>% epi_slide(~ ..2$geo_value), + expected_out + ) + expect_equal( + test_data %>% epi_slide(.f = function(x, g, t) g$geo_value), + expected_out + ) }) -test_that("`epi_slide` can access objects inside of helper functions", { - helper <- function(archive_haystack, time_value_needle) { - archive_haystack %>% epi_slide( - has_needle = time_value_needle %in% time_value, .window_size = 365000L * days_dt - ) - } - expect_error( - helper(toy_edf, as.Date("2021-01-01")), - NA +test_that("epi_slide computation via dots can use ref_time_value", { + expect_equal( + test_data %>% epi_slide(slide_value = .ref_time_value), + test_data %>% mutate(slide_value = time_value) ) }) -# TODO: Only works with overlapping ref_time_values -test_that("basic ungrouped epi_slide computation produces expected output", { - # Single geo +test_that("epi_slide computation via dots can use group", { expect_equal( - toy_edf %>% - filter(geo_value == "a") %>% - epi_slide(.window_size = 50 * days_dt, slide_value = sum(.x$value)), - compute_slide_external_g(.window_size = 50) %>% ungroup() %>% filter(geo_value == "a") %>% arrange(time_value) + test_data %>% epi_slide(slide_value = nrow(.group_key)), + test_data %>% mutate(slide_value = 1L) ) - # Multiple geos expect_equal( - toy_edf %>% - filter(time_value %in% overlap_index) %>% - epi_slide(.window_size = 50 * days_dt, slide_value = sum(.x$value)), - compute_slide_external(.window_size = 50, overlap = TRUE) %>% arrange(time_value) + test_data %>% epi_slide(slide_value = .group_key$geo_value), + test_data %>% mutate(slide_value = geo_value) ) }) -test_that("basic ungrouped epi_slide_mean computation produces expected output", { - # Single geo +test_that("epi_slide computation should not allow access from .data and .env", { + expect_error(test_data %>% epi_slide(slide_value = .env$.ref_time_value)) + expect_error(test_data %>% epi_slide(slide_value = .data$.ref_time_value)) + expect_error(test_data %>% epi_slide(slide_value = .env$.group_key)) + expect_error(test_data %>% epi_slide(slide_value = .data$.group_key)) +}) + +test_that("epi_slide computation via dots outputs the same result using col names and the data var", { + expected_output <- test_data %>% epi_slide(slide_value = max(time_value)) + expect_equal( - toy_edf %>% - filter(geo_value == "a") %>% - epi_slide_sum(value, .window_size = 50 * days_dt, na.rm = TRUE) %>% - rename(slide_value = slide_value_value), - compute_slide_external_g(.window_size = 50) %>% ungroup() %>% filter(geo_value == "a") %>% arrange(time_value) + test_data %>% epi_slide(slide_value = max(.x$time_value)), + expected_output ) - - # Multiple geos - # epi_slide_sum fails when input data groups contain duplicate time_values, - # e.g. aggregating across geos - expect_error( - toy_edf %>% epi_slide_sum(value, .window_size = 6 * days_dt), - class = "epiprocess__epi_slide_opt__duplicate_time_values" + expect_equal( + test_data %>% epi_slide(slide_value = max(.data$time_value)), + expected_output ) }) +test_that("`epi_slide` can access objects inside of helper functions", { + helper <- function(archive_haystack, time_value_needle) { + archive_haystack %>% epi_slide( + has_needle = time_value_needle %in% time_value, .window_size = Inf + ) + } + expect_no_error(helper(test_data, as.Date("2021-01-01"))) +}) -# Other example tests test_that("epi_slide can use sequential data masking expressions including NULL", { edf_a <- tibble::tibble( geo_value = 1, @@ -360,223 +503,119 @@ test_that("epi_slide can use sequential data masking expressions including NULL" ) %>% as_epi_df(as_of = 12L) - noisiness_a1 <- edf_a %>% + out1 <- edf_a %>% group_by(geo_value) %>% epi_slide( .window_size = 5L, .align = "center", - valid = nrow(.x) == 5L, - m = .x$value[1], - noisiness = m + .x$value[5], - m = NULL + m1 = .x$value[1], + m5 = .x$value[5], + derived_m5 = m1 + 4, + m1 = NULL ) %>% ungroup() %>% - filter(valid) %>% - select(-valid) - - noisiness_a0 <- edf_a %>% - filter( - time_value >= min(time_value) + 2L, - time_value <= max(time_value) - 2L - ) %>% - mutate(noisiness = 2 * 3:8) - - expect_identical(noisiness_a1, noisiness_a0) - - edf_b <- tibble::tibble( - geo_value = 1, - time_value = 1:10, - value = rep(1:2, 5L) - ) %>% + tidyr::drop_na() %>% as_epi_df(as_of = 12L) + expect_equal(out1$m5, out1$derived_m5) - noisiness_b1 <- edf_b %>% + out2 <- edf_a %>% group_by(geo_value) %>% epi_slide( .window_size = 5L, .align = "center", - valid = nrow(.x) == 5L, - model = list(lm(value ~ time_value, .x[1:2, ])), - pred = list(predict(model[[1L]], newdata = .x[3:4, "time_value"])), - model = NULL, - noisiness = sqrt(mean((.data$value[3:4] - .data$pred[[1L]])^2)), - pred = NULL + m1 = list(.x$value[1]), + m5 = list(.x$value[5]), + derived_m5 = list(m1[[1]] + 4) ) %>% ungroup() %>% - filter(valid) %>% - select(-valid) - - noisiness_b0 <- edf_b %>% - filter( - time_value >= min(time_value) + 2L, - time_value <= max(time_value) - 2L - ) %>% - mutate(noisiness = sqrt((1 - 3)^2 + (2 - 4)^2) / sqrt(2)) - - expect_equal(noisiness_b1, noisiness_b0) + filter(!is.na(m5)) %>% + as_epi_df(as_of = 12L) + expect_equal(out2$m5, out2$derived_m5) }) test_that("epi_slide complains on invalid computation outputs", { expect_error( - toy_edf %>% epi_slide(.window_size = 6L, ~ lm(value ~ time_value, .x)), + test_data %>% epi_slide(~ lm(value ~ time_value, .x)), class = "epiprocess__invalid_slide_comp_value" ) expect_no_error( - toy_edf %>% epi_slide(.window_size = 6L, ~ list(lm(value ~ time_value, .x))), + test_data %>% epi_slide(~ list(lm(value ~ time_value, .x))), class = "epiprocess__invalid_slide_comp_value" ) expect_error( - toy_edf %>% epi_slide(.window_size = 6L, model = lm(value ~ time_value, .x)), + test_data %>% epi_slide(model = lm(value ~ time_value, .x)), class = "epiprocess__invalid_slide_comp_tidyeval_output" ) expect_no_error( - toy_edf %>% epi_slide(.window_size = 6L, model = list(lm(value ~ time_value, .x))), + test_data %>% epi_slide(model = list(lm(value ~ time_value, .x))), class = "epiprocess__invalid_slide_comp_tidyeval_output" ) + expect_error( + test_data %>% + epi_slide(.window_size = 6, ~ sum(.x$value) + c(0, 0, 0)), + class = "epiprocess__invalid_slide_comp_value" + ) + expect_error( + test_data %>% + epi_slide(.window_size = 6, ~ as.list(sum(.x$value) + c(0, 0, 0))), + class = "epiprocess__invalid_slide_comp_value" + ) + expect_error( + test_data %>% + epi_slide(.window_size = 6, ~ data.frame(slide_value = sum(.x$value) + c(0, 0, 0))), + class = "epiprocess__invalid_slide_comp_value" + ) }) test_that("epi_slide can use {nm} :=", { nm <- "slide_value" expect_identical( # unfortunately, we can't pass this directly as `f` and need an extra comma - toy_edf_g %>% epi_slide(.window_size = 6L, , !!nm := sum(value)), - compute_slide_external_g(.window_size = 6) + test_data %>% epi_slide(, !!nm := sum(value), .window_size = 7), + epi_slide_sum_test(test_data, .window_size = 7) ) }) test_that("epi_slide can produce packed outputs", { - packed_basic_result <- compute_slide_external_g(.window_size = 6) %>% + packed_basic_result <- epi_slide_sum_test(test_data, .window_size = 7) %>% tidyr::pack(container = c(slide_value)) %>% - dplyr_reconstruct(compute_slide_external_g(.window_size = 6)) + dplyr_reconstruct(epi_slide_sum_test(test_data, .window_size = 7)) expect_identical( - toy_edf_g %>% - epi_slide(.window_size = 6L, ~ tibble::tibble(slide_value = sum(.x$value)), .new_col_name = "container"), + test_data %>% + epi_slide(~ tibble::tibble(slide_value = sum(.x$value)), .new_col_name = "container", .window_size = 7), packed_basic_result ) expect_identical( - toy_edf_g %>% - epi_slide(.window_size = 6L, container = tibble::tibble(slide_value = sum(.x$value))), + test_data %>% + epi_slide(container = tibble::tibble(slide_value = sum(.x$value)), .window_size = 7), packed_basic_result ) expect_identical( - toy_edf_g %>% - epi_slide(.window_size = 6L, , tibble::tibble(slide_value = sum(.x$value)), .new_col_name = "container"), + test_data %>% + epi_slide(, tibble::tibble(slide_value = sum(.x$value)), .new_col_name = "container", .window_size = 7), packed_basic_result ) }) test_that("nested dataframe output names are controllable", { expect_equal( - toy_edf_g %>% epi_slide(.window_size = 6 * days_dt, ~ data.frame(result = sum(.x$value))), - compute_slide_external_g(.window_size = 6) %>% rename(result = slide_value) + test_data %>% epi_slide(~ data.frame(result = sum(.x$value)), .window_size = 7), + epi_slide_sum_test(test_data, .window_size = 7) %>% rename(result = slide_value) ) expect_equal( - toy_edf_g %>% epi_slide(.window_size = 6 * days_dt, ~ data.frame(value_sum = sum(.x$value))), - compute_slide_external_g(.window_size = 6) %>% rename(value_sum = slide_value) - ) -}) - -# TODO: This seems really strange and counter-intuitive. Deprecate?4 -test_that("non-size-1 f outputs are no-op recycled", { - expect_equal( - toy_edf %>% - filter(time_value %in% overlap_index) %>% - epi_slide(.window_size = 6 * days_dt, ~ sum(.x$value) + c(0, 0, 0)), - compute_slide_external(.window_size = 6, overlap = TRUE) %>% arrange(time_value) - ) - expect_equal( - toy_edf %>% - filter(time_value %in% overlap_index) %>% - epi_slide(.window_size = 6 * days_dt, ~ as.list(sum(.x$value) + c(0, 0, 0))), - compute_slide_external(.window_size = 6, overlap = TRUE) %>% - dplyr::mutate(slide_value = as.list(slide_value)) %>% - arrange(time_value) - ) - expect_equal( - toy_edf %>% - filter(time_value %in% overlap_index) %>% - epi_slide(.window_size = 6 * days_dt, ~ data.frame(slide_value = sum(.x$value) + c(0, 0, 0))), - compute_slide_external(.window_size = 6, overlap = TRUE) %>% arrange(time_value) - ) - # size-1 list is recycled: - expect_equal( - toy_edf %>% - filter(time_value %in% overlap_index) %>% - epi_slide(.window_size = 6 * days_dt, ~ list(tibble(value = sum(.x$value) + c(0, 0, 0)))), - compute_slide_external(.window_size = 6, overlap = TRUE) %>% - group_by(time_value) %>% - mutate(slide_value = rep(list(tibble(value = slide_value)), 3L)) %>% - ungroup() %>% - arrange(time_value) + test_data %>% epi_slide(~ data.frame(value_sum = sum(.x$value)), .window_size = 7), + epi_slide_sum_test(test_data, .window_size = 7) %>% rename(value_sum = slide_value) ) }) test_that("`epi_slide` doesn't lose Date class output", { expect_true( - toy_edf %>% - epi_slide(.window_size = 5 * days_dt, ~ as.Date("2020-01-01")) %>% + test_data %>% + epi_slide(.window_size = 7, ~ as.Date("2020-01-01")) %>% `[[`("slide_value") %>% inherits("Date") ) }) -for (time_type in c("days", "weeks", "yearmonths", "integers")) { - for (align in c("right", "center", "left")) { - for (window_size in c(1, 6)) { - test_that(format_inline( - "epi_slide and epi_slide_mean: equivalent for - .window_size={window_size}, time_type={time_type}, and .align={align}" - ), { - set.seed(0) - n <- 16 - epi_data_no_missing <- rbind( - tibble(geo_value = "al", a = 1:n, b = rnorm(n)), - tibble(geo_value = "ca", a = n:1, b = rnorm(n) + 10), - tibble(geo_value = "fl", a = n:1, b = rnorm(n) * 2) - ) %>% - mutate( - time_value = rep( - switch(time_type, - days = as.Date("2022-01-01") + 1:n, - weeks = as.Date("2022-01-01") + 7L * 1:n, - yearmonths = tsibble::yearmonth(10L + 1:n), - integers = 2000L + 1:n, - ), 3 - ) - ) %>% - as_epi_df() %>% - group_by(geo_value) - # Remove rows 12, 13, and 14 from every group - epi_data_missing <- epi_data_no_missing %>% slice(1:11, 15:16) - units <- switch(time_type, - days = days_dt, - weeks = weeks_dt, - yearmonths = 1, - integers = 1 - ) - window_size <- window_size * units - - test_time_type_mean <- function(epi_data, ...) { - result1 <- epi_slide(epi_data, ~ data.frame( - slide_value_a = mean(.x$a, rm.na = TRUE), - slide_value_b = mean(.x$b, rm.na = TRUE) - ), - .window_size = window_size, .align = align, ... - ) - result2 <- epi_slide_mean( - epi_data, - .window_size = window_size, .align = align, - .col_names = c(a, b), na.rm = TRUE, ... - ) - expect_equal(result1, result2) - } - - test_time_type_mean(epi_data_missing) - test_time_type_mean(epi_data_no_missing) - }) - } - } -} - -test_that("helper `full_date_seq` returns expected date values", { +test_that("epi_slide_opt helper `full_date_seq` returns expected date values", { set.seed(0) n <- 7 epi_data_missing <- rbind( @@ -601,7 +640,7 @@ test_that("helper `full_date_seq` returns expected date values", { mutate(time_value = days) %>% as_epi_df() %>% group_by(geo_value), - before = before * days_dt, after = after * days_dt, time_type = "day" + before = before, after = after, time_type = "day" ), list( all_dates = as.Date(c( @@ -668,7 +707,7 @@ test_that("helper `full_date_seq` returns expected date values", { mutate(time_value = days) %>% as_epi_df() %>% group_by(geo_value), - before = before * days_dt, after = after * days_dt, time_type = "day" + before = before, after = after, time_type = "day" ), list( all_dates = as.Date(c( @@ -692,7 +731,7 @@ test_that("helper `full_date_seq` returns expected date values", { mutate(time_value = days) %>% as_epi_df() %>% group_by(geo_value), - before = before * days_dt, after = after * days_dt, time_type = "day" + before = before, after = after, time_type = "day" ), list( all_dates = as.Date(c( @@ -707,39 +746,19 @@ test_that("helper `full_date_seq` returns expected date values", { ) }) -test_that("epi_slide_mean/sum produces same output as epi_slide_opt grouped", { - expect_equal( - epi_slide_mean(toy_edf_g, value, .window_size = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(toy_edf_g, value, .f = data.table::frollmean, .window_size = 50 * days_dt, na.rm = TRUE) - ) - expect_equal( - epi_slide_mean(toy_edf_g, value, .window_size = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(toy_edf_g, value, .f = slider::slide_mean, .window_size = 50 * days_dt, na_rm = TRUE) - ) - expect_equal( - epi_slide_sum(toy_edf_g, value, .window_size = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(toy_edf_g, value, .f = data.table::frollsum, .window_size = 50 * days_dt, na.rm = TRUE) - ) - expect_equal( - epi_slide_sum(toy_edf_g, value, .window_size = 50 * days_dt, na.rm = TRUE), - epi_slide_opt(toy_edf_g, value, .f = slider::slide_sum, .window_size = 50 * days_dt, na_rm = TRUE) - ) -}) test_that("`epi_slide_opt` errors when passed non-`data.table`, non-`slider` functions", { reexport_frollmean <- data.table::frollmean expect_no_error( epi_slide_opt( - toy_edf_g, - .col_names = value, .f = reexport_frollmean, - .window_size = days_dt, .ref_time_values = test_date + 1 + test_data, + .col_names = value, .f = reexport_frollmean ) ) expect_error( epi_slide_opt( - toy_edf_g, - .col_names = value, .f = mean, - .window_size = days_dt, .ref_time_values = test_date + 1 + test_data, + .col_names = value, .f = mean ), class = "epiprocess__epi_slide_opt__unsupported_slide_function" ) @@ -754,123 +773,18 @@ multi_columns <- dplyr::bind_rows( test_that("no dplyr warnings from selecting multiple columns", { expect_no_warning( - multi_slid <- epi_slide_mean(multi_columns, .col_names = c("value", "value2"), .window_size = 3L) + multi_slid <- epi_slide_mean(multi_columns, .col_names = c("value", "value2"), .window_size = 7) ) expect_equal( names(multi_slid), c("geo_value", "time_value", "value", "value2", "slide_value_value", "slide_value_value2") ) expect_no_warning( - multi_slid_select <- epi_slide_mean(multi_columns, c(value, value2), .window_size = 3L) + multi_slid_select <- epi_slide_mean(multi_columns, c(value, value2), .window_size = 7) ) expect_equal(multi_slid_select, multi_slid) expect_no_warning( - multi_slid_select <- epi_slide_mean(multi_columns, starts_with("value"), .window_size = 3L) + multi_slid_select <- epi_slide_mean(multi_columns, starts_with("value"), .window_size = 7) ) expect_equal(multi_slid_select, multi_slid) }) - -test_that("Inf works in .window_size in slide and slide_opt", { - # Daily data - df <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:200, value = 1:200), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5)) - ) %>% - as_epi_df() - expect_equal( - df %>% - group_by(geo_value) %>% - epi_slide( - .window_size = Inf, - slide_value = sum(value) - ), - df %>% - group_by(geo_value) %>% - epi_slide( - .window_size = 365000, - slide_value = sum(value) - ) - ) - expect_equal( - df %>% - group_by(geo_value) %>% - epi_slide_opt( - .window_size = Inf, - .f = data.table::frollsum, - .col_names = value - ), - df %>% - group_by(geo_value) %>% - epi_slide( - .window_size = 365000, - slide_value_value = sum(value) - ) - ) - expect_equal( - df %>% - group_by(geo_value) %>% - epi_slide_opt( - .window_size = Inf, - .f = slider::slide_sum, - .col_names = value - ), - df %>% - group_by(geo_value) %>% - epi_slide( - .window_size = 365000, - slide_value_value = sum(value) - ) - ) - - # Weekly data - df <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:200 * 7, value = 1:200), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5 * 7, value = -(1:5)) - ) %>% - as_epi_df() - - expect_equal( - df %>% - group_by(geo_value) %>% - epi_slide( - .window_size = Inf, - slide_value = sum(value) - ), - df %>% - group_by(geo_value) %>% - epi_slide( - .window_size = 365000 * weeks_dt, - slide_value = sum(value) - ) - ) - expect_equal( - df %>% - group_by(geo_value) %>% - epi_slide_opt( - .col_names = value, - .f = data.table::frollsum, - .window_size = Inf - ), - df %>% - group_by(geo_value) %>% - epi_slide( - .window_size = 365000 * weeks_dt, - slide_value_value = sum(value) - ) - ) - expect_equal( - df %>% - group_by(geo_value) %>% - epi_slide_opt( - .window_size = Inf, - .f = slider::slide_sum, - .col_names = value - ), - df %>% - group_by(geo_value) %>% - epi_slide( - .window_size = 365000 * weeks_dt, - slide_value_value = sum(value) - ) - ) -}) diff --git a/tests/testthat/test-methods-epi_df.R b/tests/testthat/test-methods-epi_df.R index bef7f680..7ded3114 100644 --- a/tests/testthat/test-methods-epi_df.R +++ b/tests/testthat/test-methods-epi_df.R @@ -310,3 +310,21 @@ test_that("complete.epi_df works", { group_by(geo_value) ) }) + +test_that("aggregate_epi_df works", { + out <- toy_epi_df %>% aggregate_epi_df(value_col = "x") + expected_out <- toy_epi_df %>% + group_by(time_value) %>% + summarize(x = sum(x)) %>% + mutate(geo_value = "total") %>% + as_epi_df(as_of = attr(toy_epi_df, "metadata")$as_of) + expect_equal(out, expected_out) + + out <- toy_epi_df %>% aggregate_epi_df(value_col = "y", group_cols = c("time_value", "geo_value", "indic_var1")) + expected_out <- toy_epi_df %>% + group_by(time_value, geo_value, indic_var1) %>% + summarize(y = sum(y)) %>% + ungroup() %>% + as_epi_df(as_of = attr(toy_epi_df, "metadata")$as_of) + expect_equal(out, expected_out) +}) From 4444a6c75469c4d621b89b40101d52dae8e808e3 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Tue, 10 Sep 2024 15:59:32 -0700 Subject: [PATCH 078/110] Fix typo --- R/grouped_epi_archive.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 47b9fdaa..8d82849a 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -362,7 +362,7 @@ epix_slide.grouped_epi_archive <- function( # checks here in the inner loop, in order to provide immediate feedback on # some formatting errors. res <- c( - list(), # get list output; a bit faster than `as.list()`-ing `.group_key` + list(), # get list output; a bit faster than `as.list()`-ing `.group_key_label` .group_key_label, list(version = .version) ) From b2dfa092d08a2888133d1a7760b1c64f621d4074 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 12 Sep 2024 15:38:49 -0700 Subject: [PATCH 079/110] Allow dupe & dedupe cols in epi_slide; needs&helps future .keep=TRUE This has the core of the concept, but geo-grouped epi_slides will decay to tibble due to the move from group_modify -> group_map without reconstructing afterward. But planned changes to use `.keep = TRUE` should also serve to address this issue. --- R/slide.R | 100 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 82 insertions(+), 18 deletions(-) diff --git a/R/slide.R b/R/slide.R index 86ae63b5..1594e73c 100644 --- a/R/slide.R +++ b/R/slide.R @@ -260,8 +260,8 @@ epi_slide <- function( ) # If this wasn't a tidyeval computation, we still need to check the output - # types. We'll let `list_unchop` deal with checking for type compatibility - # between the outputs. + # types. We'll let `list_unchop`/`bind_rows` deal with checking for type + # compatibility between the outputs. if (!used_data_masking && !all(vapply(slide_values_list, function(comp_value) { # vctrs considers data.frames to be vectors, but we still check @@ -288,8 +288,25 @@ epi_slide <- function( dplyr::count(.data$time_value) %>% `[[`("n") - slide_values <- vctrs::list_unchop(slide_values_list) + if (length(slide_values_list) == 0L) { + # We don't know what .ptype we should be outputting, and we won't try to + # infer it by running a dummy computation. We should just output something + # that will combine well with what computations exist. In some edge cases + # (zero rows in .x, handled explicitly, or zero ref_time_values), we may + # end up just not adding any columns. + + # To combine well, we want something of a "super"-.ptype of all possible + # values. `NULL` almost works but can't be `vec_rep`'d. We'll use a 0-col + # data.frame instead, but will have to ensure it's unpacked into its 0 + # columns in case other computations return vectors by introducing a + # .group_new_col_name. + .group_new_col_name <- NULL + slide_values_list <- vctrs::new_list_of(slide_values_list, data.frame()) + } else { + .group_new_col_name <- .new_col_name + } + slide_values <- vctrs::list_unchop(slide_values_list) if ( all(purrr::map_int(slide_values_list, vctrs::vec_size) == 1L) && @@ -318,26 +335,73 @@ epi_slide <- function( .data_group <- filter(.data_group, o) } - result <- - if (is.null(.new_col_name)) { - if (inherits(slide_values, "data.frame")) { - # unpack into separate columns (without name prefix) and, if there are - # re-bindings, make the last one win for determining column value & - # column placement: - mutate(.data_group, slide_values) - } else { - # apply default name: - mutate(.data_group, slide_value = slide_values) + # To label the result, we will parallel some code from `epix_slide`, though + # some logic is different and some optimizations are less likely to be + # needed as we're at a different loop depth. + + # Unlike `epix_slide`, we will not every have to deal with a 0-row + # `.group_key`: we return early if `epi_slide`'s `.x` has 0 rows, and our + # loop over groups is the outer loop (>= 1 row into the group loop ensures + # we will have only 1-row `.group_key`s). Further, unlike `epix_slide`, we + # actually will be using `.group_data` rather than work with `.group_key` at + # all, in order to keep the pre-existing non-key columns. + + # Constructing first as list, then turning into tibble: + res <- c( + list(), # get list output; a bit faster than `as.list()`-ing `.group_key` + .group_key, + .data_group # (includes the time_value label col + other pre-existing cols) + ) + res <- vctrs::vec_recycle_common(!!!res, .size = vctrs::vec_size(.data_group)) + + # XXX mapping to columns is the same as in epix_slide, just with different + # object and error class messages&names; we might want to refactor this into + # a common function if it's not a major performance hit in epix_slide: + if (is.null(.group_new_col_name)) { + if (inherits(slide_values, "data.frame")) { + # Sometimes slide_values can parrot back columns already in `res`; allow + # this, but balk if a column has the same name as one in `res` but a + # different value: + comp_nms <- names(slide_values) + overlaps_existing_names <- comp_nms %in% names(res) + for (comp_i in which(overlaps_existing_names)) { + if (!identical(slide_values[[comp_i]], res[[comp_nms[[comp_i]]]])) { + lines <- c( + cli::format_error(c( + "conflict detected between existing columns and slide computation output:", + "i" = "pre-existing columns: {syms(names(res))}", + "x" = "slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't match the pre-existing value" + )), + capture.output(print(waldo::compare(res[[comp_nms[[comp_i]]]], slide_values[[comp_i]], x_arg = "existing", y_arg = "comp output"))), + cli::format_message(c("You likely want to rename or remove this column from your slide computation's output, or debug why it has a different value.")) + ) + rlang::abort(paste(collapse = "\n", lines), + class = "epiprocess__epi_slide_existing_vs_output_column_conflict") + } } + # Unpack into separate columns (without name prefix). If there are + # columns duplicating existing columns, de-dupe and order them as if they + # didn't exist in slide_values. + res <- c(res, slide_values[!overlaps_existing_names]) } else { - # vector or packed data.frame-type column: - mutate(.data_group, !!.new_col_name := slide_values) + # Apply default name (to vector or packed data.frame-type column): + res[["slide_value"]] <- slide_values + # TODO check for bizarre conflicting `slide_value` existing col name. + # Either here or on entry to `epi_slide` (even if there we don't know + # whether vecs will be output). Or just turn this into a special case of + # the preceding branch and let the checking code there generate a + # complaint. } + } else { + # vector or packed data.frame-type column (note: overlaps with existing + # column names should already be forbidden by earlier validation): + res[[.group_new_col_name]] <- slide_values + } - return(result) + return(res) } - .x <- group_modify(.x, slide_one_grp, + .x <- bind_rows(group_map(.x, slide_one_grp, ..., .slide_comp_factory = slide_comp_wrapper_factory, .starts = .starts, @@ -346,7 +410,7 @@ epi_slide <- function( .all_rows = .all_rows, .new_col_name = .new_col_name, .keep = FALSE - ) + )) return(.x) From 9b4f10abc9f31209ea8dc4ee2005c02d2a6e01a9 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Thu, 12 Sep 2024 22:45:21 +0000 Subject: [PATCH 080/110] style: styler (GHA) --- R/slide.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/slide.R b/R/slide.R index 1594e73c..8733f523 100644 --- a/R/slide.R +++ b/R/slide.R @@ -376,7 +376,8 @@ epi_slide <- function( cli::format_message(c("You likely want to rename or remove this column from your slide computation's output, or debug why it has a different value.")) ) rlang::abort(paste(collapse = "\n", lines), - class = "epiprocess__epi_slide_existing_vs_output_column_conflict") + class = "epiprocess__epi_slide_existing_vs_output_column_conflict" + ) } } # Unpack into separate columns (without name prefix). If there are From a110a420250c361b957c6dda072e8264983c36b3 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 12 Sep 2024 16:13:18 -0700 Subject: [PATCH 081/110] Move to .keep = TRUE in `epi_slide` + fix other dedupe issues --- R/grouped_epi_archive.R | 2 +- R/slide.R | 24 ++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 8d82849a..0524b48b 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -474,7 +474,7 @@ epix_slide.grouped_epi_archive <- function( } return( - dplyr::bind_rows(dplyr::group_map( + dplyr::bind_rows(dplyr::group_map( # note: output will be ungrouped dplyr::group_by(as_of_df, !!!syms(.x$private$vars), .drop = .x$private$drop), group_map_fn, .slide_comp = .slide_comp, ..., diff --git a/R/slide.R b/R/slide.R index 8733f523..eb737fc7 100644 --- a/R/slide.R +++ b/R/slide.R @@ -344,19 +344,14 @@ epi_slide <- function( # loop over groups is the outer loop (>= 1 row into the group loop ensures # we will have only 1-row `.group_key`s). Further, unlike `epix_slide`, we # actually will be using `.group_data` rather than work with `.group_key` at - # all, in order to keep the pre-existing non-key columns. + # all, in order to keep the pre-existing non-key columns. We will also try + # to work directly with `epi_df`s instead of listified tibbles; since we're + # not in as tight of a loop, the increased overhead hopefully won't matter. + # We'll need to use `bind_cols` rather than `c` to avoid losing + # `epi_df`ness. - # Constructing first as list, then turning into tibble: - res <- c( - list(), # get list output; a bit faster than `as.list()`-ing `.group_key` - .group_key, - .data_group # (includes the time_value label col + other pre-existing cols) - ) - res <- vctrs::vec_recycle_common(!!!res, .size = vctrs::vec_size(.data_group)) + res <- .data_group - # XXX mapping to columns is the same as in epix_slide, just with different - # object and error class messages&names; we might want to refactor this into - # a common function if it's not a major performance hit in epix_slide: if (is.null(.group_new_col_name)) { if (inherits(slide_values, "data.frame")) { # Sometimes slide_values can parrot back columns already in `res`; allow @@ -383,7 +378,7 @@ epi_slide <- function( # Unpack into separate columns (without name prefix). If there are # columns duplicating existing columns, de-dupe and order them as if they # didn't exist in slide_values. - res <- c(res, slide_values[!overlaps_existing_names]) + res <- bind_cols(res, slide_values[!overlaps_existing_names]) } else { # Apply default name (to vector or packed data.frame-type column): res[["slide_value"]] <- slide_values @@ -402,6 +397,7 @@ epi_slide <- function( return(res) } + .x_groups <- groups(.x) .x <- bind_rows(group_map(.x, slide_one_grp, ..., .slide_comp_factory = slide_comp_wrapper_factory, @@ -410,9 +406,9 @@ epi_slide <- function( .ref_time_values = .ref_time_values, .all_rows = .all_rows, .new_col_name = .new_col_name, - .keep = FALSE + .keep = TRUE )) - + .x <- group_by(.x, !!!.x_groups) return(.x) } From dfd49f546719795f3c404cffe33a9373beca8eed Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 6 Sep 2024 08:24:12 -0700 Subject: [PATCH 082/110] fix: aggregate is now sum_groups_epi_df and other review changes * duplicated time values check in epi_df constructor improved * dplyr warning and unnecessary if in sum_groups_epi_df fixed * args in epi_slide are now validated in order of func signature * simplify deprecated check * error if .new_col_name is "geo_value" or "time_value" * better TODO comment over last part of epi_slide * comment about yearmonth - Inf weirdness * change tests few tests * remove complete_only and auto complete Co-authored-by: brookslogan --- NAMESPACE | 2 +- R/epi_df.R | 10 +- R/grouped_epi_archive.R | 2 +- R/methods-epi_df.R | 59 ++- R/slide.R | 243 ++++++------ man/complete.epi_df.Rd | 7 +- man/epi_slide.Rd | 13 +- ...gregate_epi_df.Rd => sum_groups_epi_df.Rd} | 11 +- tests/testthat/test-epi_slide.R | 367 +++++++----------- tests/testthat/test-methods-epi_df.R | 13 +- 10 files changed, 347 insertions(+), 380 deletions(-) rename man/{aggregate_epi_df.Rd => sum_groups_epi_df.Rd} (63%) diff --git a/NAMESPACE b/NAMESPACE index 1e94cbf3..3b61a1b7 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -45,7 +45,6 @@ S3method(ungroup,epi_df) S3method(ungroup,grouped_epi_archive) S3method(unnest,epi_df) export("%>%") -export(aggregate_epi_df) export(archive_cases_dv_subset) export(arrange) export(arrange_canonical) @@ -87,6 +86,7 @@ export(relocate) export(rename) export(revision_summary) export(slice) +export(sum_groups_epi_df) export(time_column_names) export(ungroup) export(unnest) diff --git a/R/epi_df.R b/R/epi_df.R index f525d9db..3ca6cc8f 100644 --- a/R/epi_df.R +++ b/R/epi_df.R @@ -278,11 +278,13 @@ as_epi_df.tbl_df <- function( assert_character(other_keys) - # Check one time_value per group + if (".time_value_counts" %in% other_keys) { + cli_abort("as_epi_df: `other_keys` can't include \".time_value_counts\"") + } duplicated_time_values <- x %>% group_by(across(all_of(c("geo_value", "time_value", other_keys)))) %>% - dplyr::summarize(n = dplyr::n(), .groups = "drop") %>% - filter(n > 1) + filter(dplyr::n() > 1) %>% + ungroup() if (nrow(duplicated_time_values) > 0) { bad_data <- capture.output(duplicated_time_values) cli_abort( @@ -325,5 +327,5 @@ is_epi_df <- function(x) { } group_epi_df <- function(x) { - x %>% group_by(group_by(across(all_of(kill_time_value(key_colnames(.)))))) + x %>% group_by(across(all_of(kill_time_value(key_colnames(.))))) } diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index a8eef106..5f43dbdb 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -275,7 +275,7 @@ epix_slide.grouped_epi_archive <- function( checkmate::assert_string(.new_col_name, null.ok = TRUE) if (identical(.new_col_name, "time_value")) { cli_abort( - '`new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name + '`.new_col_name` must not be `"time_value"`; `epix_slide()` uses that column name to attach the `ref_time_value` associated with each slide computation' ) } diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index 83e0a089..99d4e58f 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -255,9 +255,10 @@ group_modify.epi_df <- function(.data, .f, ..., .keep = FALSE) { #' Complete epi_df #' -#' A [tidyr::complete()] analogue for `epi_df` objects. This function fills in -#' missing combinations of `geo_value` and `time_value` with `NA` values. See -#' the examples for usage details. +#' A ‘tidyr::complete()’ analogue for ‘epi_df’ objects. This function +#' can be used, for example, to add rows for missing combinations +#' of ‘geo_value’ and ‘time_value’, filling other columns with `NA`s. +#' See the examples for usage details. #' #' @param data an `epi_df` #' @param ... see [`tidyr::complete`] @@ -391,28 +392,46 @@ arrange_canonical.epi_df <- function(x, ...) { #' the resulting `epi_df` will have `geo_value` set to `"total"`. #' #' @param .x an `epi_df` -#' @param value_col character name of the column to aggregate -#' @param group_cols character vector of column names to group by +#' @param value_col character vector of the columns to aggregate +#' @param group_cols character vector of column names to group by. "time_value" is +#' included by default. #' @return an `epi_df` object #' #' @export -aggregate_epi_df <- function(.x, value_col = "value", group_cols = "time_value") { +sum_groups_epi_df <- function(.x, sum_cols = "value", group_cols = character()) { assert_class(.x, "epi_df") - assert_character(value_col, len = 1) + assert_character(sum_cols) assert_character(group_cols) - checkmate::assert_subset(value_col, names(.x)) - checkmate::assert_subset(group_cols, names(.x)) + checkmate::assert_subset(sum_cols, setdiff(names(.x), key_colnames(.x))) + checkmate::assert_subset(group_cols, key_colnames(.x)) + if (!"time_value" %in% group_cols) { + group_cols <- c("time_value", group_cols) + } - .x %>% + out <- .x %>% group_by(across(all_of(group_cols))) %>% - dplyr::summarize(!!(value_col) := sum(!!sym(value_col))) %>% - ungroup() %>% - { - if (!"geo_value" %in% group_cols) { - mutate(., geo_value = "total") %>% relocate(geo_value, .before = 1) - } else { - . - } - } %>% - as_epi_df(as_of = attr(.x, "metadata")$as_of) + dplyr::summarize(across(all_of(sum_cols), sum), .groups = "drop") + + # To preserve epi_df-ness, we need to ensure that the `geo_value` column is + # present. + out <- if (!"geo_value" %in% group_cols) { + out %>% + mutate(geo_value = "total") %>% + relocate(geo_value, .before = 1) + } else { + out + } + + # The `geo_type` will be correctly inherited here by the following logic: + # - if `geo_value` is in `group_cols`, then the constructor will see the + # geo_value here and will correctly read the existing values + # - if `geo_value` is not in `group_cols`, then the constructor will see + # the unrecognizeable "total" value and will correctly infer the "custom" + # geo_type. + out %>% + as_epi_df( + as_of = attr(.x, "metadata")$as_of, + other_keys = intersect(attr(.x, "metadata")$other_keys, group_cols) + ) %>% + arrange_canonical() } diff --git a/R/slide.R b/R/slide.R index 375d4326..275d6142 100644 --- a/R/slide.R +++ b/R/slide.R @@ -12,13 +12,13 @@ #' section for more. If a function, `.f` must have the form `function(x, g, t, #' ...)`, where #' -#' - "x" is a data frame with the same column names as the original object, +#' - `x` is a data frame with the same column names as the original object, #' minus any grouping variables, with only the windowed data for one #' group-`.ref_time_value` combination -#' - "g" is a one-row tibble containing the values of the grouping variables +#' - `g` is a one-row tibble containing the values of the grouping variables #' for the associated group -#' - "t" is the ref_time_value for the current window -#' - "..." are additional arguments +#' - `t` is the `.ref_time_value` for the current window +#' - `...` are additional arguments #' #' If a formula, `.f` can operate directly on columns accessed via `.x$var` or #' `.$var`, as in `~mean(.x$var)` to compute a mean of a column `var` for each @@ -38,7 +38,7 @@ #' complete window of `before` and `after` values are returned. If `FALSE`, the #' function `f` may be given a reduced window size, commonly at the beginning #' of the time series, but also possibly in the interior if the `time_value` -#' column has gaps (see `complete.epi_df` to address the latter). +#' column has gaps (see `complete.epi_df()` to address the latter). #' #' @template basic-slide-details #' @@ -92,10 +92,10 @@ epi_slide <- function( .x, .f, ..., .window_size = NULL, .align = c("right", "center", "left"), - .ref_time_values = NULL, .new_col_name = NULL, .all_rows = FALSE, .complete_only = FALSE) { + .ref_time_values = NULL, .new_col_name = NULL, .all_rows = FALSE) { # Deprecated argument handling provided_args <- rlang::call_args_names(rlang::call_match()) - if (any(purrr::map_lgl(provided_args, ~ .x %in% c("x", "f", "ref_time_values", "new_col_name", "all_rows")))) { + if (any(provided_args %in% c("x", "f", "ref_time_values", "new_col_name", "all_rows"))) { cli::cli_abort( "epi_slide: you are using one of the following old argument names: `x`, `f`, `ref_time_values`, `new_col_name`, or `all_rows`. Please use the new dot-prefixed names: `.x`, `.f`, `.ref_time_values`, @@ -128,46 +128,21 @@ epi_slide <- function( key_colnames() %>% kill_time_value() %>% sort() - if (.x %>% groups() %>% as.character() %>% sort() != expected_group_keys) { + if (!identical(.x %>% group_vars() %>% sort(), expected_group_keys)) { cli_abort( - "epi_slide: `.x` must be either ungrouped or grouped by {expected_group_keys}. You may need to aggregate - your data first, see aggregate_epi_df().", - class = "epi_slide__invalid_grouping" + "epi_slide: `.x` must be either grouped by {expected_group_keys}. (Or you can just ungroup + `.x` and we'll do this grouping automatically.) You may need to aggregate your data first, + see aggregate_epi_df().", + class = "epiprocess__epi_slide__invalid_grouping" ) } } else { .x <- group_epi_df(.x) } - if (nrow(.x) == 0L) { return(.x) } - if (is.null(.ref_time_values)) { - .ref_time_values <- unique(.x$time_value) - } else { - assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE, unique = TRUE) - if (!test_subset(.ref_time_values, unique(.x$time_value))) { - cli_abort( - "epi_slide: `ref_time_values` must be a unique subset of the time values in `x`.", - class = "epi_slide__invalid_ref_time_values" - ) - } - } - .ref_time_values <- sort(.ref_time_values) - - align <- rlang::arg_match(.align) - time_type <- attr(.x, "metadata")$time_type - if (is.null(.window_size)) { - if (time_type == "week") { - .window_size <- as.difftime(1, units = "weeks") - } else { - .window_size <- 1 - } - } - validate_slide_window_arg(.window_size, time_type) - window_args <- get_before_after_from_window(.window_size, align, time_type) - # If `f` is missing, interpret ... as an expression for tidy evaluation if (missing(.f)) { used_data_masking <- TRUE @@ -184,64 +159,98 @@ epi_slide <- function( } else { used_data_masking <- FALSE } - f <- as_slide_computation(.f, ...) + .f <- as_slide_computation(.f, ...) - assert_logical(.complete_only, len = 1) - if (identical(.window_size, Inf) && .complete_only) { + .align <- rlang::arg_match(.align) + time_type <- attr(.x, "metadata")$time_type + if (is.null(.window_size)) { + cli_abort("epi_slide: `.window_size` must be specified.") + } + validate_slide_window_arg(.window_size, time_type) + window_args <- get_before_after_from_window(.window_size, .align, time_type) + + if (is.null(.ref_time_values)) { + .ref_time_values <- unique(.x$time_value) + } else { + assert_numeric(.ref_time_values, min.len = 1L, null.ok = FALSE, any.missing = FALSE, unique = TRUE) + if (!test_subset(.ref_time_values, unique(.x$time_value))) { + cli_abort( + "epi_slide: `ref_time_values` must be a unique subset of the time values in `x`.", + class = "epiprocess__epi_slide_invalid_ref_time_values" + ) + } + } + .ref_time_values <- sort(.ref_time_values) + + assert_character(.new_col_name, null.ok = TRUE) + if (any(.new_col_name %in% c("geo_value", "time_value"))) { cli_abort( - "epi_slide: `complete_only` is not supported with an infinite window size." + "epi_slide: `.new_col_name` cannot be one of 'geo_value' or 'time_value'.", + class = "epiprocess__epi_slide_invalid_new_col_name" ) } + assert_logical(.all_rows, len = 1) + + # Begin handling completion. This will create a complete time index between + # the smallest and largest time values in the data. This is used to ensure + # that the slide function is called with a complete window of data. Each slide + # group will filter this down to between its min and max time values. We also + # mark which dates were in the data and which were added by our completion. + date_seq_list <- full_date_seq(.x, window_args$before, window_args$after, time_type) + .x$.real <- TRUE + # Create a wrapper that calculates and passes `.ref_time_value` to the # computation. `i` is contained in the `f_wrapper_factory` environment so when # it is called in `slide_one_grp`, `i` advances through the list of reference # time values within a group and then resets back to 1 when switching groups. f_wrapper_factory <- function(kept_ref_time_values) { i <- 1L + # TODO: This is where we would do the debug wrapper. f_wrapper <- function(.x, .group_key, ...) { .ref_time_value <- kept_ref_time_values[[i]] i <<- i + 1L - f(.x, .group_key, .ref_time_value, ...) + .f(.x, .group_key, .ref_time_value, ...) } return(f_wrapper) } - epi_slide_one_group_partial <- function(.data_group, .group_key, ...) { - epi_slide_one_group( - .data_group, .group_key, ..., - f_factory = f_wrapper_factory, - before = window_args$before, - after = window_args$after, - ref_time_values = .ref_time_values, - all_rows = .all_rows, - new_col_name = .new_col_name, - used_data_masking = used_data_masking, - time_type = time_type, - complete_only = .complete_only - ) - } - - # If .x is not grouped, then the trivial group is applied: https://dplyr.tidyverse.org/reference/group_map.html - # `...` from top of `epi_slide` are forwarded to `.f` here. - # If every group takes the length(available_ref_time_values) == 0 branch in - # epi_slide_one_group, then we end up in a situation where the result as no - # new columns at all. This is a very fragile solution, I might even just - # remove it and error instead. - result <- group_modify(.x, epi_slide_one_group_partial, ..., .keep = FALSE) - if (ncol(result) == ncol(.x)) { - cli_warn( + # - If .x is not grouped, then the trivial group is applied: + # https://dplyr.tidyverse.org/reference/group_map.html + # - We create a lambda that forwards the necessary slide arguments to + # `epi_slide_one_group`. + # - `...` from top of `epi_slide` are forwarded to `.f` here through + # group_modify and through the lambda. + result <- group_modify( + .x, + .f = function(.data_group, .group_key, ...) { + epi_slide_one_group( + .data_group, .group_key, ..., + .f_factory = f_wrapper_factory, + .before = window_args$before, + .after = window_args$after, + .ref_time_values = .ref_time_values, + .all_rows = .all_rows, + .new_col_name = .new_col_name, + .used_data_masking = used_data_masking, + .time_type = time_type, + .date_seq_list = date_seq_list + ) + }, + ..., + .keep = FALSE + ) %>% + filter(.real) %>% + select(-.real) + + # If every group in epi_slide_one_group takes the + # length(available_ref_time_values) == 0 branch then we end up here. + if (ncol(result) == ncol(.x %>% select(-.real))) { + cli_abort( "epi_slide: no new columns were created. This can happen if every group has no available ref_time_values. - In this case we return your epi_df but with an all-NA column 'slide_value' or what you provided in - `.new_col_name`. If your computation returned data.frames you may not get the expected column names.", + This is likely a mistake in your data, in the slide computation, or in the ref_time_values argument.", class = "epiprocess__epi_slide_no_new_columns" ) - - if (is.null(.new_col_name)) { - result <- mutate(result, slide_value = NA) - } else { - result <- mutate(result, !!.new_col_name := NA) - } } return(result) } @@ -251,43 +260,48 @@ epi_slide <- function( epi_slide_one_group <- function( .data_group, .group_key, ..., - f_factory, before, after, ref_time_values, all_rows, new_col_name, used_data_masking, time_type, complete_only) { - if (complete_only) { - # Filter out any ref_time_values that don't have a complete window. - available_ref_time_values <- ref_time_values %>% purrr::keep(function(rtv) { - .data_group %>% - filter(rtv - before <= time_value & time_value <= rtv + after) %>% - nrow() == before + after + 1 - }) - } else { - # Which of the ref time values are available in this group? - available_ref_time_values <- ref_time_values[ref_time_values %in% .data_group$time_value] - } + .f_factory, .before, .after, .ref_time_values, .all_rows, + .new_col_name, .used_data_masking, .time_type, .date_seq_list) { + available_ref_time_values <- .ref_time_values[ + .ref_time_values >= min(.data_group$time_value) & .ref_time_values <= max(.data_group$time_value) + ] + + # Unpack the date_seq_list argument and complete the data group with missing + # time values, padding on the left and right as needed. + all_dates <- .date_seq_list$all_dates + missing_times <- all_dates[!(all_dates %in% .data_group$time_value)] + .data_group <- bind_rows( + .data_group, + tibble(time_value = c( + missing_times, + .date_seq_list$pad_early_dates, + .date_seq_list$pad_late_dates + ), .real = FALSE) + ) %>% + arrange(.data$time_value) # If the data group does not contain any of the reference time values, return # the original .data_group without slide columns and let bind_rows at the end # of group_modify handle filling the empty data frame with NA values. if (length(available_ref_time_values) == 0L) { - if (all_rows) { - if (complete_only) { - return(.data_group %>% filter(min(time_value) + before <= time_value & time_value <= max(time_value) - after)) - } else { - return(.data_group) - } + if (.all_rows) { + return(.data_group) } return(.data_group %>% filter(FALSE)) } # Get stateful function that tracks ref_time_value per group and sends it to # `f` when called. - f <- f_factory(available_ref_time_values) + f <- .f_factory(available_ref_time_values) - if (time_type == "yearmonth" && identical(before, Inf)) { + if (.time_type == "yearmonth" && identical(.before, Inf)) { + # - Inf is NA(s) rather than -Inf as a yearmonth; feed in -Inf manually + # (it will successfully be cast to -Inf as a yearmonth) starts <- rep(-Inf, length(available_ref_time_values)) - stops <- available_ref_time_values + after + stops <- available_ref_time_values + .after } else { - starts <- available_ref_time_values - before - stops <- available_ref_time_values + after + starts <- available_ref_time_values - .before + stops <- available_ref_time_values + .after } # Compute the slide values. slider::hop_index will return a list of f outputs @@ -329,10 +343,10 @@ epi_slide_one_group <- function( ) } # Returned values must always be a scalar vector or a data frame with one row. - if (all(vctrs::list_sizes(slide_values_list) != 1L)) { + if (any(vctrs::list_sizes(slide_values_list) != 1L)) { cli_abort( - "The slide computations must either (a) output a single element/row each or - (b) one element/row per appearance of the reference time value in the local window.", + "epi_slide: slide computations must return a single element (e.g. a scalar value, a single data.frame row, + or a list).", class = "epiprocess__invalid_slide_comp_value" ) } @@ -341,12 +355,7 @@ epi_slide_one_group <- function( slide_values <- slide_values_list %>% vctrs::list_unchop() # If all rows, then pad slide values with NAs, else filter down data group - if (all_rows) { - if (complete_only) { - # Modify the .data_group so that we ignore the time values on the edges. - .data_group <- .data_group %>% - filter(min(time_value) + before <= time_value & time_value <= max(time_value) - after) - } + if (.all_rows) { orig_values <- slide_values slide_values <- vctrs::vec_rep(vctrs::vec_cast(NA, orig_values), nrow(.data_group)) vctrs::vec_slice(slide_values, .data_group$time_value %in% available_ref_time_values) <- orig_values @@ -355,16 +364,16 @@ epi_slide_one_group <- function( } result <- - if (is.null(new_col_name) && inherits(slide_values, "data.frame")) { + if (is.null(.new_col_name) && inherits(slide_values, "data.frame")) { # Unpack into separate columns (without name prefix). If there are # re-bindings, the last one wins for determining column value & placement. mutate(.data_group, slide_values) - } else if (is.null(new_col_name) && !inherits(slide_values, "data.frame")) { + } else if (is.null(.new_col_name) && !inherits(slide_values, "data.frame")) { # Unpack into default name "slide_value". mutate(.data_group, slide_value = slide_values) } else { # Unpack vector into given name or a packed data.frame-type column. - mutate(.data_group, !!new_col_name := slide_values) + mutate(.data_group, !!.new_col_name := slide_values) } return(result) @@ -374,11 +383,13 @@ get_before_after_from_window <- function(window_size, align, time_type) { if (identical(window_size, Inf)) { if (align == "right") { before <- Inf - if (time_type %in% c("day", "week")) { - after <- as.difftime(0, units = glue::glue("{time_type}s")) - } else { - after <- 0 - } + # styler: off + after <- switch(time_type, + day = , week = as.difftime(0, units = glue::glue("{time_type}s")), + yearmonth = , integer = 0L, + cli_abort("Unrecognized time_type: {time_type}.") + ) + # styler: on } else { cli_abort( "`epi_slide`: center and left alignment are not supported with an infinite window size." @@ -575,13 +586,13 @@ epi_slide_opt <- function( if (!test_subset(.ref_time_values, unique(.x$time_value))) { cli_abort( "`ref_time_values` must be a unique subset of the time values in `x`.", - class = "epi_slide_opt__invalid_ref_time_values" + class = "epiprocess__epi_slide_opt_invalid_ref_time_values" ) } if (anyDuplicated(.ref_time_values) != 0L) { cli_abort( "`ref_time_values` must not contain any duplicates; use `unique` if appropriate.", - class = "epi_slide_opt__invalid_ref_time_values" + class = "epiprocess__epi_slide_opt_invalid_ref_time_values" ) } } diff --git a/man/complete.epi_df.Rd b/man/complete.epi_df.Rd index 9f450cb0..9d791fb7 100644 --- a/man/complete.epi_df.Rd +++ b/man/complete.epi_df.Rd @@ -16,9 +16,10 @@ \item{explicit}{see \code{\link[tidyr:complete]{tidyr::complete}}} } \description{ -A \code{\link[tidyr:complete]{tidyr::complete()}} analogue for \code{epi_df} objects. This function fills in -missing combinations of \code{geo_value} and \code{time_value} with \code{NA} values. See -the examples for usage details. +A ‘tidyr::complete()’ analogue for ‘epi_df’ objects. This function +can be used, for example, to add rows for missing combinations +of ‘geo_value’ and ‘time_value’, filling other columns with \code{NA}s. +See the examples for usage details. } \examples{ start_date <- as.Date("2020-01-01") diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index 4450e496..96442fbf 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -12,8 +12,7 @@ epi_slide( .align = c("right", "center", "left"), .ref_time_values = NULL, .new_col_name = NULL, - .all_rows = FALSE, - .complete_only = FALSE + .all_rows = FALSE ) } \arguments{ @@ -27,13 +26,13 @@ sliding (a.k.a. "rolling") time window for each data group. The window is determined by the \code{.window_size} and \code{.align} parameters, see the details section for more. If a function, \code{.f} must have the form \verb{function(x, g, t, ...)}, where \itemize{ -\item "x" is a data frame with the same column names as the original object, +\item \code{x} is a data frame with the same column names as the original object, minus any grouping variables, with only the windowed data for one group-\code{.ref_time_value} combination -\item "g" is a one-row tibble containing the values of the grouping variables +\item \code{g} is a one-row tibble containing the values of the grouping variables for the associated group -\item "t" is the ref_time_value for the current window -\item "..." are additional arguments +\item \code{t} is the \code{.ref_time_value} for the current window +\item \code{...} are additional arguments } If a formula, \code{.f} can operate directly on columns accessed via \code{.x$var} or @@ -91,7 +90,7 @@ of the slide computation output.} complete window of \code{before} and \code{after} values are returned. If \code{FALSE}, the function \code{f} may be given a reduced window size, commonly at the beginning of the time series, but also possibly in the interior if the \code{time_value} -column has gaps (see \code{complete.epi_df} to address the latter).} +column has gaps (see \code{complete.epi_df()} to address the latter).} } \value{ An \code{epi_df} object given by appending one or more new columns to \code{.x}, diff --git a/man/aggregate_epi_df.Rd b/man/sum_groups_epi_df.Rd similarity index 63% rename from man/aggregate_epi_df.Rd rename to man/sum_groups_epi_df.Rd index 702aec84..8b4c13ba 100644 --- a/man/aggregate_epi_df.Rd +++ b/man/sum_groups_epi_df.Rd @@ -1,17 +1,18 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/methods-epi_df.R -\name{aggregate_epi_df} -\alias{aggregate_epi_df} +\name{sum_groups_epi_df} +\alias{sum_groups_epi_df} \title{Aggregate an \code{epi_df} object} \usage{ -aggregate_epi_df(.x, value_col = "value", group_cols = "time_value") +sum_groups_epi_df(.x, sum_cols = "value", group_cols = character()) } \arguments{ \item{.x}{an \code{epi_df}} -\item{value_col}{character name of the column to aggregate} +\item{group_cols}{character vector of column names to group by. "time_value" is +included by default.} -\item{group_cols}{character vector of column names to group by} +\item{value_col}{character vector of the columns to aggregate} } \value{ an \code{epi_df} object diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index be684a62..fe33ac25 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -15,8 +15,8 @@ get_test_units <- function(time_type = "day") { switch(time_type, day = as.difftime(1, units = "days"), week = as.difftime(1, units = "weeks"), - yearmonth = 1, - integer = 1 + yearmonth = 1L, + integer = 1L ) } get_test_dataset <- function(n, time_type = "day", other_keys = character()) { @@ -33,9 +33,9 @@ get_test_dataset <- function(n, time_type = "day", other_keys = character()) { # but overlapping time index. Each geo has a missing value somewhere in the middle. tibble::tribble( ~geo_value, ~time_value, ~value, ~x, - "a", test_date + units * 0:n_, 0:n_, rep(c(1, 2), length.out = n), - "b", test_date + units * 0:n_, 10 * n + 0:n_, rep(c(1, 2), length.out = n), - "c", test_date + units * (floor(n / 2) + 0:n_), 100 * n + 0:n_, rep(c(1, 2), length.out = n) + "a", test_date + units * 0:n_, (0:n_)**2, rep(c(1, 2), length.out = n), + "b", test_date + units * 0:n_, (10 * n + 0:n_)**2, rep(c(1, 2), length.out = n), + "c", test_date + units * (floor(n / 2) + 0:n_), (100 * n + 0:n_)**2, rep(c(1, 2), length.out = n) ) %>% tidyr::unnest_longer(c(time_value, value, x)) %>% slice(-10) %>% @@ -45,100 +45,106 @@ get_test_dataset <- function(n, time_type = "day", other_keys = character()) { test_data <- get_test_dataset(num_rows_per_group, "day") # TODO: Add a test that uses an 'other_key' grouping column. +# TODO: Add a case where the data contains NA values (not just gaps in time_value). epi_slide_sum_test <- function( .x, - .window_size = 1, .align = "right", .ref_time_values = NULL, .all_rows = FALSE, .complete_only = FALSE) { + .window_size = 1, .align = "right", .ref_time_values = NULL, .all_rows = FALSE) { time_type <- attr(.x, "metadata")$time_type window_args <- get_before_after_from_window(.window_size, .align, time_type) + date_seq_list <- full_date_seq(.x, window_args$before, window_args$after, time_type) + if (is.null(.ref_time_values)) { + .ref_time_values <- date_seq_list$all_dates + } + .x %>% + mutate(.real = TRUE) %>% + group_by(geo_value) %>% + complete(time_value = vctrs::vec_c(!!!date_seq_list, .name_spec = rlang::zap())) %>% + arrange(geo_value, time_value) %>% mutate( slide_value = slider::slide_index_sum( .data$value, .data$time_value, before = window_args$before, - after = window_args$after, - complete = .complete_only + after = window_args$after ) ) %>% # If .all_rows = TRUE, we need to keep all rows and NA out the ones not in # the ref_time_values. Otherwise, we need to return only the rows in # ref_time_values. group_modify(~ { - if (is.null(.ref_time_values)) { - .ref_time_values <- unique(.$time_value) - } - if (.complete_only) { - # Filter out any ref_time_values that don't have a complete window. - available_ref_time_values <- purrr::keep(.ref_time_values, function(rtv) { - filter(., rtv - window_args$before <= time_value & time_value <= rtv + window_args$after) %>% - nrow() == window_args$before + window_args$after + 1 - }) - } else { - # Which of the ref time values are available in this group? - available_ref_time_values <- .ref_time_values[.ref_time_values %in% .$time_value] - } + available_ref_time_values <- .ref_time_values[.ref_time_values %in% .$time_value] if (.all_rows) { - . <- dplyr::mutate(., slide_value = dplyr::if_else(time_value %in% available_ref_time_values, slide_value, NA)) - if (.complete_only) { - filter( - ., - min(time_value) + window_args$before <= time_value & time_value <= max(time_value) - window_args$after - ) - } else { - . - } + dplyr::mutate(., slide_value = dplyr::if_else(time_value %in% available_ref_time_values, slide_value, NA)) } else { dplyr::filter(., time_value %in% available_ref_time_values) } - }) + }) %>% + filter(.real) %>% + select(-.real) } concatenate_list_params <- function(p) { paste(paste0(names(p), "=", p), collapse = "\n") } -vec_equal_reasonable <- function(x, y) { - if (is.null(x) && is.null(y)) { - return(TRUE) - } else if (is.null(x) && !is.null(y)) { - return(FALSE) - } else if (!is.null(x) && is.null(y)) { - return(FALSE) - } else if (length(x) != length(y)) { - return(FALSE) - } - all(x == y) +is_null_or_na <- function(x) { + is.null(x) || + (is.na(x) && (is.logical(x) || is.double(x))) || + identical(x, list(NULL)) || + identical(x, list(NA)) +} +test_that("is_null_or_na works", { + x1 <- NULL + x2 <- NA + x3 <- NA_real_ + x4 <- 1 + x5 <- "NA" + x6 <- list(NULL) + x7 <- list(NA) + + expect_true(is_null_or_na(x1)) + expect_true(is_null_or_na(x2)) + expect_true(is_null_or_na(x3)) + expect_false(is_null_or_na(x4)) + expect_false(is_null_or_na(x5)) + expect_true(is_null_or_na(x6)) + expect_true(is_null_or_na(x7)) +}) +expect_equal_handle_null <- function(x, y) { + x_na_mask <- purrr::map_lgl(x, is_null_or_na) + y_na_mask <- purrr::map_lgl(y, is_null_or_na) + expect_equal(x_na_mask, y_na_mask) + expect_equal(x[!x_na_mask], y[!y_na_mask]) } -# Massive amounts of basic functionality tests across an exhaustive combination -# of parameters. +# Core functionality tests across an exhaustive combination of parameters on +# non-trivial data sets with three geo_groups, with non-identical time indices, +# with missing time values, and with reported NA values. +# .ref_time_values can be: +# - NULL is a special case where we just use all the unique time_values in the +# data. +# - c(1, 2) correspond to test_date + 1 * units and test_date + 2 * units. +# This is outside the time_value index for group c and is close to the +# left edge for a and b, so if window_size = 7, the output should be +# either empty or NA (depending if .all_rows is TRUE or not). +# - c(8, 9) corresponds to test_date + 8 * units amd test_date + 9 * units. +# In this case, groups a and b have values, but c does not. param_combinations <- bind_rows( tidyr::expand_grid( .time_type = c("day", "week", "yearmonth", "integer"), - .align = c("right", "center", "left"), - .window_size = c(1, 7), - # .ref_time_values can be: - # - NULL is a special case where we just use all the unique time_values in the - # data. - # - c(1, 2) correspond to test_date + 1 * units and test_date + 2 * units. - # This is outside the time_value index for group c and is close to the left - # edge for a and b, so if .complete_only is TRUE, there output should be - # either empty or NA (depending if .all_rows is TRUE or not), otherwise if - # .complete_only is FALSE, only the a and b groups should have values. - # - c(8) corresponds to test_date + 8 * units. In this case, groups a and b - # have values, but c does not. .ref_time_values = list(NULL, c(1, 2), c(8, 9)), - .complete_only = c(FALSE, TRUE), .all_rows = c(FALSE, TRUE), + .align = c("right", "center", "left"), + .window_size = c(1, 7), ), tidyr::expand_grid( .time_type = c("day", "week", "yearmonth", "integer"), - .align = c("right"), - .window_size = c(Inf), .ref_time_values = list(NULL, c(1, 2), c(8, 9)), - .complete_only = c(FALSE), .all_rows = c(FALSE, TRUE), + .align = c("right"), + .window_size = c(Inf), ) ) for (p in (param_combinations %>% transpose())) { @@ -149,50 +155,19 @@ for (p in (param_combinations %>% transpose())) { if (!is.null(p$.ref_time_values)) { p$.ref_time_values <- test_date + units * p$.ref_time_values } - slide_args <- p[-which(names(p) %in% c(".time_type"))] as_of <- attr(test_data, "metadata")$as_of - simple_epi_slide_call <- function(.f) { - if ( - vec_equal_reasonable(p$.ref_time_values, c(test_date + 1 * units, test_date + 2 * units)) && - p$.complete_only && - as.numeric(p$.window_size) == 7 && - p$.align != "left" - ) { - expect_warning( - out <- rlang::inject(epi_slide(test_data, .f, !!!slide_args)), - class = "epiprocess__epi_slide_no_new_columns" - ) - } else { - out <- rlang::inject(epi_slide(test_data, .f, !!!slide_args)) - } - out - } - expect_equal_mod <- function(x, y) { - # This branch occurs if .all_rows = FALSE and the ref_time_values have no - # overlaps with the data. In this case, our test function will also return - # an empty df, but with slightly different types. - if (nrow(x) == 0 && nrow(y) == 0) { - expect_equal(names(x), names(y)) - # This branch occurs if .all_rows = TRUE and the ref_time_values have no - # overlaps with the data. In this case epi_slide codes the NA vector as - # logical and epi_slide_sum_test codes it as double. - } else if (all(is.na(x$slide_value)) || all(is.na(y$slide_value))) { - expect_equal(names(x), names(y)) - expect_equal(x %>% select(-slide_value), y %>% select(-slide_value)) - } else { - expect_equal(x, y) - } - } - expected_out <- rlang::inject(epi_slide_sum_test(test_data, !!!slide_args)) + slide_args <- p[setdiff(names(p), c(".time_type"))] test_that( format_inline( - "epi_slide works with formulas.:\n", + "epi_slide works correctly with formula vector output and params:\n", concatenate_list_params(p) ), { - expect_equal_mod( - simple_epi_slide_call(~ sum(.x$value)), + out <- rlang::inject(epi_slide(test_data, .f = ~ sum(.x$value), !!!slide_args)) + expected_out <- rlang::inject(epi_slide_sum_test(test_data, !!!slide_args)) + expect_equal( + out, expected_out ) } @@ -200,12 +175,14 @@ for (p in (param_combinations %>% transpose())) { test_that( format_inline( - "epi_slide works with data.frame outputs. Params:\n", + "epi_slide works correctly with formula data.frame output and params:\n", concatenate_list_params(p) ), { - expect_equal_mod( - simple_epi_slide_call(~ data.frame(slide_value = sum(.x$value))), + out <- rlang::inject(epi_slide(test_data, .f = ~ data.frame(slide_value = sum(.x$value)), !!!slide_args)) + expected_out <- rlang::inject(epi_slide_sum_test(test_data, !!!slide_args)) + expect_equal( + out, expected_out ) } @@ -213,155 +190,111 @@ for (p in (param_combinations %>% transpose())) { test_that( format_inline( - "epi_slide works with list outputs. Params:\n", + "epi_slide works correctly with formula list output and params:\n", concatenate_list_params(p) ), { - expect_equal_mod( - simple_epi_slide_call(~ list(sum(.x$value))), - expected_out %>% - rowwise() %>% - mutate( - slide_value = if_else(!is.na(slide_value), list(slide_value), list(NULL)) - ) %>% - ungroup() %>% - as_epi_df(as_of = as_of) %>% - group_by(geo_value) + out <- rlang::inject(epi_slide(test_data, .f = ~ list(sum(.x$value)), !!!slide_args)) + expected_out <- rlang::inject(epi_slide_sum_test(test_data, !!!slide_args)) %>% + rowwise() %>% + mutate(slide_value = list(slide_value)) %>% + ungroup() %>% + as_epi_df(as_of = as_of) %>% + group_by(geo_value) + + expect_equal( + out %>% select(-slide_value), + expected_out %>% select(-slide_value) ) + expect_equal_handle_null(out$slide_value, expected_out$slide_value) } ) test_that( format_inline( - "epi_slide works with list data.frame outputs. Params:\n", + "epi_slide works correctly with formula tibble list output and params:\n", concatenate_list_params(p) ), { - expect_equal_mod( - simple_epi_slide_call(~ list(data.frame(slide_value = sum(.x$value)))), - expected_out %>% - rowwise() %>% - mutate( - slide_value = if_else(!is.na(slide_value), list(data.frame(slide_value = slide_value)), list(NULL)) - ) %>% - ungroup() %>% - as_epi_df(as_of = as_of) %>% - group_by(geo_value) + out <- rlang::inject(epi_slide(test_data, .f = ~ tibble(slide_value = list(sum(.x$value))), !!!slide_args)) + expected_out <- rlang::inject(epi_slide_sum_test(test_data, !!!slide_args)) %>% + rowwise() %>% + mutate(slide_value = list(slide_value)) %>% + ungroup() %>% + as_epi_df(as_of = as_of) %>% + group_by(geo_value) + expect_equal( + out %>% select(-slide_value), + expected_out %>% select(-slide_value) ) + expect_equal_handle_null(out$slide_value, expected_out$slide_value) } ) test_that( format_inline( - "epi_slide works with tibble list outputs. Params:\n", + "epi_slide works with unnamed data-masking data.frame and params:\n", concatenate_list_params(p) ), { + expected_out <- rlang::inject(epi_slide_sum_test(test_data, !!!slide_args)) expect_equal_mod( - simple_epi_slide_call(~ tibble(slide_value = list(sum(.x$value)))), - expected_out %>% - ungroup() %>% - rowwise() %>% - mutate( - slide_value = if_else(!is.na(slide_value), list(slide_value), list(NULL)) - ) %>% - ungroup() %>% - as_epi_df(as_of = as_of) %>% - group_by(geo_value) + rlang::inject(epi_slide( + test_data, , data.frame(slide_value = sum(.x$value)), + !!!slide_args + )), + expected_out ) } ) test_that( format_inline( - "epi_slide works with unnamed data-masking data.frame. Params:\n", + "epi_slide and epi_slide_opt/sum/mean outputs are consistent. Params:\n", concatenate_list_params(p) ), { - # unfortunately, we can't pass this directly as `f` and need an extra comma - if ( - vec_equal_reasonable(p$.ref_time_values, c(test_date + 1 * units, test_date + 2 * units)) && - p$.complete_only && - as.numeric(p$.window_size) == 7 && - p$.align != "left" - ) { - expect_warning( - out <- rlang::inject(epi_slide(test_data, , data.frame(slide_value = sum(.x$value)), !!!slide_args)), - class = "epiprocess__epi_slide_no_new_columns" - ) - } else { - out <- rlang::inject(epi_slide(test_data, , data.frame(slide_value = sum(.x$value)), !!!slide_args)) - } - expect_equal_mod( - out, - expected_out + out_sum <- rlang::inject(epi_slide(test_data, ~ sum(.x$value), !!!slide_args)) %>% + rename(slide_value_value = slide_value) + out_mean <- rlang::inject(epi_slide(test_data, ~ mean(.x$value), !!!slide_args)) %>% + rename(slide_value_value = slide_value) + + expect_equal( + out_sum, + rlang::inject(epi_slide_opt(test_data, value, .f = data.table::frollsum, !!!slide_args)) + ) + expect_equal( + out_sum, + rlang::inject(epi_slide_opt(test_data, value, .f = slider::slide_sum, !!!slide_args)) + ) + expect_equal( + out_sum, + rlang::inject(epi_slide_sum(test_data, value, !!!slide_args)) + ) + expect_equal( + out_mean, + rlang::inject(epi_slide_opt(test_data, value, .f = data.table::frollmean, !!!slide_args)) + ) + expect_equal( + out_mean, + rlang::inject(epi_slide_opt(test_data, value, .f = slider::slide_mean, !!!slide_args)) + ) + expect_equal( + out_mean, + rlang::inject(epi_slide_mean(test_data, value, !!!slide_args)) ) } ) - - # These are the consistency tests between epi_slide and epi_slide_opt - # functions. Only the specific case of .complete_only = FALSE and the opt - # functions using na.rm = TRUE is testsed (the two options are equivalent for - # our purposes here). - # TODO: See if we can include the .complete_only = TRUE case in the future. - # TODO: Add a case where the data contains NA values (not just gaps in time_value). - if (!p$.complete_only) { - opt_slide_args <- p[-which(names(p) %in% c(".complete_only", ".time_type"))] - test_that( - format_inline( - "epi_slide and epi_slide_opt/sum/mean consistency test. Params:\n", - concatenate_list_params(p) - ), - { - if ( - vec_equal_reasonable(p$.ref_time_values, c(test_date + 1 * units, test_date + 2 * units)) && - p$.complete_only && - as.numeric(p$.window_size) == 7 && - p$.align != "left" - ) { - expect_warning( - { - out_sum <- rlang::inject(epi_slide(test_data, ~ sum(.x$value), !!!opt_slide_args)) - out_mean <- rlang::inject(epi_slide(test_data, ~ mean(.x$value), !!!opt_slide_args)) - }, - class = "epiprocess__epi_slide_no_new_columns" - ) - } else { - out_sum <- rlang::inject(epi_slide(test_data, ~ sum(.x$value), !!!opt_slide_args)) %>% - rename(slide_value_value = slide_value) - out_mean <- rlang::inject(epi_slide(test_data, ~ mean(.x$value), !!!opt_slide_args)) %>% - rename(slide_value_value = slide_value) - } - - expect_equal( - out_sum, - rlang::inject(epi_slide_opt(test_data, value, .f = data.table::frollsum, !!!opt_slide_args, na.rm = TRUE)) - ) - expect_equal( - out_sum, - rlang::inject(epi_slide_opt(test_data, value, .f = slider::slide_sum, !!!opt_slide_args, na_rm = TRUE)) - ) - expect_equal( - out_sum, - rlang::inject(epi_slide_sum(test_data, value, !!!opt_slide_args, na.rm = TRUE)) - ) - expect_equal( - out_mean, - rlang::inject(epi_slide_opt(test_data, value, .f = data.table::frollmean, !!!opt_slide_args, na.rm = TRUE)) - ) - expect_equal( - out_mean, - rlang::inject(epi_slide_opt(test_data, value, .f = slider::slide_mean, !!!opt_slide_args, na_rm = TRUE)) - ) - expect_equal( - out_mean, - rlang::inject(epi_slide_mean(test_data, value, !!!opt_slide_args, na.rm = TRUE)) - ) - } - ) - } } +# TODO: This. +test_that(".window_size as integer works", { + expect_equal( + epi_slide(test_data, ~ sum(.x$value), .window_size = 7), + epi_slide_sum_test(test_data, .window_size = 7) + ) +}) + bad_values <- list( "a", 0.5, -1L, -1.5, 1.5, NA, c(0, 1) ) @@ -370,11 +303,11 @@ for (bad_value in bad_values) { format_inline("`.window_size` fails on {bad_value}"), { expect_error( - epi_slide(test_data, .window_size = bad_value), + epi_slide(test_data, ~ sum(.x), .window_size = bad_value), class = "epiprocess__validate_slide_window_arg" ) expect_error( - epi_slide_mean(test_data, .col_names = value, .window_size = bad_value), + epi_slide_mean(test_data, ~ sum(.x), .col_names = value, .window_size = bad_value), class = "epiprocess__validate_slide_window_arg" ) } @@ -385,11 +318,11 @@ test_that(format_inline("epi_slide should fail when `.ref_time_values` is out of bad_values <- c(min(test_data$time_value) - 1, max(test_data$time_value) + 1) expect_error( epi_slide(test_data, ~ sum(.x), .ref_time_values = bad_values), - class = "epi_slide__invalid_ref_time_values" + class = "epiprocess__epi_slide_invalid_ref_time_values" ) expect_error( epi_slide_mean(test_data, .col_names = value, .ref_time_values = bad_values), - class = "epi_slide_opt__invalid_ref_time_values" + class = "epiprocess__epi_slide_opt_invalid_ref_time_values" ) }) diff --git a/tests/testthat/test-methods-epi_df.R b/tests/testthat/test-methods-epi_df.R index 7ded3114..f1bca059 100644 --- a/tests/testthat/test-methods-epi_df.R +++ b/tests/testthat/test-methods-epi_df.R @@ -311,8 +311,8 @@ test_that("complete.epi_df works", { ) }) -test_that("aggregate_epi_df works", { - out <- toy_epi_df %>% aggregate_epi_df(value_col = "x") +test_that("sum_groups_epi_df works", { + out <- toy_epi_df %>% sum_groups_epi_df(sum_cols = "x") expected_out <- toy_epi_df %>% group_by(time_value) %>% summarize(x = sum(x)) %>% @@ -320,11 +320,12 @@ test_that("aggregate_epi_df works", { as_epi_df(as_of = attr(toy_epi_df, "metadata")$as_of) expect_equal(out, expected_out) - out <- toy_epi_df %>% aggregate_epi_df(value_col = "y", group_cols = c("time_value", "geo_value", "indic_var1")) + out <- toy_epi_df %>% + sum_groups_epi_df(sum_cols = c("x", "y"), group_cols = c("time_value", "geo_value", "indic_var1")) expected_out <- toy_epi_df %>% group_by(time_value, geo_value, indic_var1) %>% - summarize(y = sum(y)) %>% - ungroup() %>% - as_epi_df(as_of = attr(toy_epi_df, "metadata")$as_of) + summarize(x = sum(x), y = sum(y), .groups = "drop") %>% + as_epi_df(as_of = attr(toy_epi_df, "metadata")$as_of, other_keys = "indic_var1") %>% + arrange_canonical() expect_equal(out, expected_out) }) From 53005ff19ae1b16641082bc28f7dff507366be32 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 13 Sep 2024 00:36:30 -0700 Subject: [PATCH 083/110] Correct commentary regarding slide output type edge cases --- R/slide.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/slide.R b/R/slide.R index eb737fc7..bdb13e17 100644 --- a/R/slide.R +++ b/R/slide.R @@ -292,8 +292,9 @@ epi_slide <- function( # We don't know what .ptype we should be outputting, and we won't try to # infer it by running a dummy computation. We should just output something # that will combine well with what computations exist. In some edge cases - # (zero rows in .x, handled explicitly, or zero ref_time_values), we may - # end up just not adding any columns. + # (zero rows in .x, zero .ref_time_values) we may end up just not adding + # any columns, but those edge cases are currently explicitly handled + # earlier (outputting zero columns and aborting, respectively). # To combine well, we want something of a "super"-.ptype of all possible # values. `NULL` almost works but can't be `vec_rep`'d. We'll use a 0-col From e1d300d982544aaedd8aea2a058fad807746fdd4 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 13 Sep 2024 01:39:09 -0700 Subject: [PATCH 084/110] feat(epi_slide): catch common operations x forgotten colname See #475. We have the ability to catch this consistently now since we are using `.keep = TRUE`, so the .x into each slide computation is an `epi_df` even if we're grouping by `geo_value` (previously, .x would have decayed into a tibble and we shouldn't override tibble's behavior). Also add missing `group_map` import. --- DESCRIPTION | 1 + NAMESPACE | 3 +++ R/epi_df_forbidden_methods.R | 48 ++++++++++++++++++++++++++++++++++++ R/slide.R | 2 +- 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 R/epi_df_forbidden_methods.R diff --git a/DESCRIPTION b/DESCRIPTION index e14bc7c6..333bf13c 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -79,6 +79,7 @@ Collate: 'correlation.R' 'data.R' 'epi_df.R' + 'epi_df_forbidden_methods.R' 'epiprocess.R' 'group_by_epi_df_methods.R' 'methods-epi_archive.R' diff --git a/NAMESPACE b/NAMESPACE index a417837f..a9544763 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,6 +2,7 @@ S3method("[",epi_df) S3method("names<-",epi_df) +S3method(Summary,epi_df) S3method(arrange_canonical,default) S3method(arrange_canonical,epi_df) S3method(as_epi_df,data.frame) @@ -36,6 +37,7 @@ S3method(key_colnames,data.frame) S3method(key_colnames,default) S3method(key_colnames,epi_archive) S3method(key_colnames,epi_df) +S3method(mean,epi_df) S3method(next_after,Date) S3method(next_after,integer) S3method(print,epi_archive) @@ -148,6 +150,7 @@ importFrom(dplyr,everything) importFrom(dplyr,filter) importFrom(dplyr,group_by) importFrom(dplyr,group_by_drop_default) +importFrom(dplyr,group_map) importFrom(dplyr,group_modify) importFrom(dplyr,group_vars) importFrom(dplyr,groups) diff --git a/R/epi_df_forbidden_methods.R b/R/epi_df_forbidden_methods.R new file mode 100644 index 00000000..00372f9a --- /dev/null +++ b/R/epi_df_forbidden_methods.R @@ -0,0 +1,48 @@ +# Methods in this file are used to +# * Disable problematic inherited behavior (e.g., mean on epi_dfs) +# * Provide better error messaging if possible for things that already abort +# when they should (e.g., sum on epi_dfs) + + +# Disable mean on epi_dfs, to prevent `epi_slide(~ mean(.x), ....)` bad output: + +#' @export +mean.epi_df <- function(x, ...) { + cli_abort(c( + "`mean` shouldn't be used on entire `epi_df`s", + "x" = "{rlang::caller_arg(x)} was an `epi_df`", + "i" = "If you encountered this while trying to take a rolling mean + of a column using `epi_slide`, you probably forgot to + specify the column name (e.g., ~ mean(.x$colname)). You may + also prefer to use the specialized `epi_slide_mean` method." + )) +} + +# Similarly, provide better error messages for some other potentially-common +# slide operations (sum, prod, min, max, all, any, range): + +#' @export +Summary.epi_df <- function(..., na.rm = FALSE) { + # cli uses dot prefixes for special purpose; use alias to avoid confusion during interpolation + generic <- .Generic + opt_pointer <- switch(.Generic, + sum = "You may also prefer to use the specialized `epi_slide_sum` method.", + prod = , + min = , + max = , + all = , + any = "You may also prefer to use the specialized `epi_slide_opt` method.", + range = "", + cli_abort("Unrecognized .Generic: {generic}") + ) + cli_abort(c( + "`{generic}` shouldn't be used on entire `epi_df`s", + # We'd like to quote user input in the error message, but `caller_arg(..1)` is + # just "..1" and (eagerness/S4/unnamedness?) issues thwart some alternatives; just + # use something generic: + "x" = "`{generic}`'s first argument was an `epi_df`", + "i" = "If you encountered this while trying to take a rolling {generic} + of a column using `epi_slide`, you probably forgot to + specify the column name (e.g., ~ mean(.x$colname)). {opt_pointer}" + )) +} diff --git a/R/slide.R b/R/slide.R index bdb13e17..df2e9c91 100644 --- a/R/slide.R +++ b/R/slide.R @@ -36,7 +36,7 @@ #' @template basic-slide-details #' #' @importFrom lubridate days weeks -#' @importFrom dplyr bind_rows group_vars filter select +#' @importFrom dplyr bind_rows group_map group_vars filter select #' @importFrom rlang .data .env !! enquos sym env missing_arg #' @export #' @seealso [`epi_slide_opt`] [`epi_slide_mean`] [`epi_slide_sum`] From 129ad9fe0e67204f8712ff8efe0a1ae028a71b8f Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 13 Sep 2024 12:13:54 -0700 Subject: [PATCH 085/110] Test epi_df forbidden methods + fix error message --- R/epi_df_forbidden_methods.R | 6 +-- .../_snaps/epi_df_forbidden_methods.md | 40 +++++++++++++++++++ .../testthat/test-epi_df_forbidden_methods.R | 22 ++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 tests/testthat/_snaps/epi_df_forbidden_methods.md create mode 100644 tests/testthat/test-epi_df_forbidden_methods.R diff --git a/R/epi_df_forbidden_methods.R b/R/epi_df_forbidden_methods.R index 00372f9a..254713d6 100644 --- a/R/epi_df_forbidden_methods.R +++ b/R/epi_df_forbidden_methods.R @@ -15,7 +15,7 @@ mean.epi_df <- function(x, ...) { of a column using `epi_slide`, you probably forgot to specify the column name (e.g., ~ mean(.x$colname)). You may also prefer to use the specialized `epi_slide_mean` method." - )) + ), class = "epiprocess__summarizer_on_entire_epi_df") } # Similarly, provide better error messages for some other potentially-common @@ -43,6 +43,6 @@ Summary.epi_df <- function(..., na.rm = FALSE) { "x" = "`{generic}`'s first argument was an `epi_df`", "i" = "If you encountered this while trying to take a rolling {generic} of a column using `epi_slide`, you probably forgot to - specify the column name (e.g., ~ mean(.x$colname)). {opt_pointer}" - )) + specify the column name (e.g., ~ {generic}(.x$colname)). {opt_pointer}" + ), class = "epiprocess__summarizer_on_entire_epi_df") } diff --git a/tests/testthat/_snaps/epi_df_forbidden_methods.md b/tests/testthat/_snaps/epi_df_forbidden_methods.md new file mode 100644 index 00000000..12dc3d48 --- /dev/null +++ b/tests/testthat/_snaps/epi_df_forbidden_methods.md @@ -0,0 +1,40 @@ +# Forbidden epi_df methods have decent error messages + + Code + edf %>% epi_slide(.window_size = 7L, ~ mean(.x)) + Condition + Error in `mean()`: + ! `mean` shouldn't be used on entire `epi_df`s + x .x was an `epi_df` + i If you encountered this while trying to take a rolling mean of a column using `epi_slide`, you probably forgot to specify the column name (e.g., ~ mean(.x$colname)). You may also prefer to use the specialized `epi_slide_mean` method. + +--- + + Code + edf %>% epi_slide(.window_size = 7L, ~ sum(.x)) + Condition + Error in `.slide_comp()`: + ! `sum` shouldn't be used on entire `epi_df`s + x `sum`'s first argument was an `epi_df` + i If you encountered this while trying to take a rolling sum of a column using `epi_slide`, you probably forgot to specify the column name (e.g., ~ sum(.x$colname)). You may also prefer to use the specialized `epi_slide_sum` method. + +--- + + Code + edf %>% epi_slide(.window_size = 7L, ~ min(.x)) + Condition + Error in `.slide_comp()`: + ! `min` shouldn't be used on entire `epi_df`s + x `min`'s first argument was an `epi_df` + i If you encountered this while trying to take a rolling min of a column using `epi_slide`, you probably forgot to specify the column name (e.g., ~ min(.x$colname)). You may also prefer to use the specialized `epi_slide_opt` method. + +--- + + Code + edf %>% epi_slide(.window_size = 7L, ~ range(.x)) + Condition + Error in `.slide_comp()`: + ! `range` shouldn't be used on entire `epi_df`s + x `range`'s first argument was an `epi_df` + i If you encountered this while trying to take a rolling range of a column using `epi_slide`, you probably forgot to specify the column name (e.g., ~ range(.x$colname)). + diff --git a/tests/testthat/test-epi_df_forbidden_methods.R b/tests/testthat/test-epi_df_forbidden_methods.R new file mode 100644 index 00000000..a6e74086 --- /dev/null +++ b/tests/testthat/test-epi_df_forbidden_methods.R @@ -0,0 +1,22 @@ + +edf <- as_epi_df(tibble( + geo_value = rep("nd", 10L), + time_value = as.Date("2020-01-01") + 1:10 - 1L, + value = 1:10 +)) + +test_that("Forbidden epi_df methods catches omitted column names in slide comp", { + for (f in list(mean, sum, prod, min, max, all, any, range)) { + expect_error(edf %>% epi_slide(.window_size = 7L, ~ f(.x)), + class = "epiprocess__summarizer_on_entire_epi_df") + expect_error(edf %>% group_by(geo_value) %>% epi_slide(.window_size = 7L, ~ f(.x)), + class = "epiprocess__summarizer_on_entire_epi_df") + } +}) + +test_that("Forbidden epi_df methods have decent error messages", { + expect_snapshot(error = TRUE, edf %>% epi_slide(.window_size = 7L, ~ mean(.x))) + expect_snapshot(error = TRUE, edf %>% epi_slide(.window_size = 7L, ~ sum(.x))) + expect_snapshot(error = TRUE, edf %>% epi_slide(.window_size = 7L, ~ min(.x))) + expect_snapshot(error = TRUE, edf %>% epi_slide(.window_size = 7L, ~ range(.x))) +}) From fd044338b622d9a56bf9e2e688d434e9e4434744 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Fri, 13 Sep 2024 19:15:50 +0000 Subject: [PATCH 086/110] style: styler (GHA) --- tests/testthat/test-epi_df_forbidden_methods.R | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/testthat/test-epi_df_forbidden_methods.R b/tests/testthat/test-epi_df_forbidden_methods.R index a6e74086..62d7cba0 100644 --- a/tests/testthat/test-epi_df_forbidden_methods.R +++ b/tests/testthat/test-epi_df_forbidden_methods.R @@ -1,4 +1,3 @@ - edf <- as_epi_df(tibble( geo_value = rep("nd", 10L), time_value = as.Date("2020-01-01") + 1:10 - 1L, @@ -8,9 +7,11 @@ edf <- as_epi_df(tibble( test_that("Forbidden epi_df methods catches omitted column names in slide comp", { for (f in list(mean, sum, prod, min, max, all, any, range)) { expect_error(edf %>% epi_slide(.window_size = 7L, ~ f(.x)), - class = "epiprocess__summarizer_on_entire_epi_df") + class = "epiprocess__summarizer_on_entire_epi_df" + ) expect_error(edf %>% group_by(geo_value) %>% epi_slide(.window_size = 7L, ~ f(.x)), - class = "epiprocess__summarizer_on_entire_epi_df") + class = "epiprocess__summarizer_on_entire_epi_df" + ) } }) From 16cf8d7d9216504f873c812faf1977c22a378ee1 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 13 Sep 2024 12:32:59 -0700 Subject: [PATCH 087/110] Use `cnd_class = TRUE` when snapshot is primary test --- tests/testthat/_snaps/archive.md | 2 +- tests/testthat/test-archive.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/_snaps/archive.md b/tests/testthat/_snaps/archive.md index 9eab6e9f..6e010da0 100644 --- a/tests/testthat/_snaps/archive.md +++ b/tests/testthat/_snaps/archive.md @@ -2,7 +2,7 @@ Code res <- dumb_ex %>% as_epi_archive() - Condition + Condition Warning: Found rows that appear redundant based on last (version of each) observation carried forward; these rows have been removed to 'compactify' and save space: Key: diff --git a/tests/testthat/test-archive.R b/tests/testthat/test-archive.R index 1791d870..7bde9b46 100644 --- a/tests/testthat/test-archive.R +++ b/tests/testthat/test-archive.R @@ -55,7 +55,7 @@ dumb_ex <- data.frame( version = as.Date(c("2020-01-01", "2020-01-02")) ) test_that("new_epi_archive correctly detects and warns about compactification", { - expect_snapshot(res <- dumb_ex %>% as_epi_archive()) + expect_snapshot(res <- dumb_ex %>% as_epi_archive(), cnd_class = TRUE) }) test_that("other_keys can only contain names of the data.frame columns", { From 8eca3211694cf79a70fd1804c005bb71994a767d Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 13 Sep 2024 13:43:45 -0700 Subject: [PATCH 088/110] improve is null or na --- tests/testthat/test-epi_slide.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index fe33ac25..da88be7d 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -92,7 +92,8 @@ is_null_or_na <- function(x) { is.null(x) || (is.na(x) && (is.logical(x) || is.double(x))) || identical(x, list(NULL)) || - identical(x, list(NA)) + identical(x, list(NA)) || + identical(x, list(NA_real_)) } test_that("is_null_or_na works", { x1 <- NULL @@ -102,6 +103,7 @@ test_that("is_null_or_na works", { x5 <- "NA" x6 <- list(NULL) x7 <- list(NA) + x8 <- list(NA_real_) expect_true(is_null_or_na(x1)) expect_true(is_null_or_na(x2)) @@ -110,6 +112,7 @@ test_that("is_null_or_na works", { expect_false(is_null_or_na(x5)) expect_true(is_null_or_na(x6)) expect_true(is_null_or_na(x7)) + expect_true(is_null_or_na(x8)) }) expect_equal_handle_null <- function(x, y) { x_na_mask <- purrr::map_lgl(x, is_null_or_na) From b1ab47da271505fdb005f2894488a389e956581e Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Mon, 16 Sep 2024 16:58:30 -0700 Subject: [PATCH 089/110] refactor: move group_epi_df --- NAMESPACE | 1 + R/epi_df.R | 4 ---- R/methods-epi_df.R | 7 +++---- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 3b61a1b7..968ddabb 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -71,6 +71,7 @@ export(filter) export(full_seq) export(geo_column_names) export(group_by) +export(group_epi_df) export(group_modify) export(growth_rate) export(guess_period) diff --git a/R/epi_df.R b/R/epi_df.R index 3ca6cc8f..420ce2dc 100644 --- a/R/epi_df.R +++ b/R/epi_df.R @@ -325,7 +325,3 @@ as_epi_df.tbl_ts <- function(x, as_of, other_keys = character(), ...) { is_epi_df <- function(x) { inherits(x, "epi_df") } - -group_epi_df <- function(x) { - x %>% group_by(across(all_of(kill_time_value(key_colnames(.))))) -} diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index 99d4e58f..e2153a52 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -379,10 +379,9 @@ arrange_canonical.default <- function(x, ...) { #' @export arrange_canonical.epi_df <- function(x, ...) { rlang::check_dots_empty() - keys <- key_colnames(x) - x %>% - dplyr::relocate(dplyr::all_of(keys), .before = 1) %>% - dplyr::arrange(dplyr::across(dplyr::all_of(keys))) +#' @export +group_epi_df <- function(x) { + x %>% group_by(across(all_of(kill_time_value(key_colnames(.))))) } #' Aggregate an `epi_df` object From 6b93d79fa9677b37b6ea91cce2263cf9c77cd958 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Mon, 16 Sep 2024 16:59:28 -0700 Subject: [PATCH 090/110] refactor: add arrange_[col/row]_canonical --- NAMESPACE | 4 ++++ R/methods-epi_df.R | 43 +++++++++++++++++++++++++++++++++++++++++++ R/slide.R | 14 +++++++------- 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 968ddabb..aa84fb2f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,6 +4,10 @@ S3method("[",epi_df) S3method("names<-",epi_df) S3method(arrange_canonical,default) S3method(arrange_canonical,epi_df) +S3method(arrange_col_canonical,default) +S3method(arrange_col_canonical,epi_df) +S3method(arrange_row_canonical,default) +S3method(arrange_row_canonical,epi_df) S3method(as_epi_df,data.frame) S3method(as_epi_df,epi_df) S3method(as_epi_df,tbl_df) diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index e2153a52..9dc2d06e 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -379,6 +379,49 @@ arrange_canonical.default <- function(x, ...) { #' @export arrange_canonical.epi_df <- function(x, ...) { rlang::check_dots_empty() + x %>% + arrange_row_canonical() %>% + arrange_col_canonical() +} + +arrange_row_canonical <- function(x, ...) { + UseMethod("arrange_row_canonical") +} + +#' @export +arrange_row_canonical.default <- function(x, ...) { + rlang::check_dots_empty() + cli::cli_abort(c( + "`arrange_row_canonical()` is only meaningful for an {.cls epi_df}." + )) + return(x) +} + +#' @export +arrange_row_canonical.epi_df <- function(x, ...) { + rlang::check_dots_empty() + x %>% dplyr::arrange(dplyr::across(dplyr::all_of(key_colnames(.)))) +} + +arrange_col_canonical <- function(x, ...) { + UseMethod("arrange_col_canonical") +} + +#' @export +arrange_col_canonical.default <- function(x, ...) { + rlang::check_dots_empty() + cli::cli_abort(c( + "`arrange_col_canonical()` is only meaningful for an {.cls epi_df}." + )) + return(x) +} + +#' @export +arrange_col_canonical.epi_df <- function(x, ...) { + rlang::check_dots_empty() + x %>% dplyr::relocate(dplyr::all_of(key_colnames(.)), .before = 1) +} + #' @export group_epi_df <- function(x) { x %>% group_by(across(all_of(kill_time_value(key_colnames(.))))) diff --git a/R/slide.R b/R/slide.R index 275d6142..cbef5de1 100644 --- a/R/slide.R +++ b/R/slide.R @@ -206,7 +206,6 @@ epi_slide <- function( # time values within a group and then resets back to 1 when switching groups. f_wrapper_factory <- function(kept_ref_time_values) { i <- 1L - # TODO: This is where we would do the debug wrapper. f_wrapper <- function(.x, .group_key, ...) { .ref_time_value <- kept_ref_time_values[[i]] i <<- i + 1L @@ -241,7 +240,8 @@ epi_slide <- function( .keep = FALSE ) %>% filter(.real) %>% - select(-.real) + select(-.real) %>% + arrange_col_canonical() # If every group in epi_slide_one_group takes the # length(available_ref_time_values) == 0 branch then we end up here. @@ -737,10 +737,10 @@ epi_slide_opt <- function( } result <- mutate(.x, .real = TRUE) %>% - group_modify(slide_one_grp, ..., .keep = FALSE) - - result <- result[result$.real, ] - result$.real <- NULL + group_modify(slide_one_grp, ..., .keep = FALSE) %>% + filter(.real) %>% + select(-.real) %>% + arrange_col_canonical() if (.all_rows) { result[!(result$time_value %in% ref_time_values), result_col_names] <- NA @@ -749,7 +749,7 @@ epi_slide_opt <- function( } if (!is_epi_df(result)) { - # `.all_rows`handling strips epi_df format and metadata. + # `.all_rows` handling strips epi_df format and metadata. # Restore them. result <- reclass(result, attributes(.x)$metadata) } From 926f84587d19bfa1ef13a11331efeab131b15ea1 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Mon, 16 Sep 2024 17:29:29 -0700 Subject: [PATCH 091/110] refactor: improve and slim down epi_slide tests --- tests/testthat/test-epi_slide.R | 207 +++++++++++++++++++------------- 1 file changed, 123 insertions(+), 84 deletions(-) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index da88be7d..8ee2ee80 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -2,7 +2,7 @@ library(cli) library(dplyr) library(purrr) -num_rows_per_group <- 20 +num_rows_per_group <- 30 get_test_date <- function(time_type = "day") { switch(time_type, day = as.Date("2020-01-01"), @@ -19,49 +19,74 @@ get_test_units <- function(time_type = "day") { integer = 1L ) } -get_test_dataset <- function(n, time_type = "day", other_keys = character()) { +# Returns a tibble with two geos on the same time index and one geo with a +# different but overlapping time index. Each geo has a missing value somewhere +# in the middle and a separate reported NA elsewhere. +get_test_dataset <- function(n, time_type = "day", other_keys = FALSE) { checkmate::assert_integerish(n, lower = 1) checkmate::assert_character(time_type) - checkmate::assert_character(other_keys) - checkmate::assert_subset(other_keys, "x") + checkmate::assert_logical(other_keys) # Do this to actually get n rows per group. n_ <- n - 1 + values <- vctrs::vec_assign(0:n_, floor(n * 2 / 3), value = NA_real_) test_date <- get_test_date(time_type) units <- get_test_units(time_type) - # A tibble with two geos on the same time index and one geo with a different - # but overlapping time index. Each geo has a missing value somewhere in the middle. - tibble::tribble( - ~geo_value, ~time_value, ~value, ~x, - "a", test_date + units * 0:n_, (0:n_)**2, rep(c(1, 2), length.out = n), - "b", test_date + units * 0:n_, (10 * n + 0:n_)**2, rep(c(1, 2), length.out = n), - "c", test_date + units * (floor(n / 2) + 0:n_), (100 * n + 0:n_)**2, rep(c(1, 2), length.out = n) + df <- tibble::tribble( + ~geo_value, ~time_value, ~value, + "a", test_date + units * 0:n_, values**2, + "b", test_date + units * 0:n_, (10 * n + values)**2, + "c", test_date + units * (floor(n / 2) + 0:n_), (100 * n + values)**2, ) %>% - tidyr::unnest_longer(c(time_value, value, x)) %>% - slice(-10) %>% - as_epi_df(as_of = test_date + n, other_keys = other_keys) %>% - group_by(geo_value) + tidyr::unnest_longer(c(time_value, value)) %>% + slice(-10) + + if (other_keys) { + df <- bind_rows( + df %>% mutate(x = 1, value = value + 1), + df %>% mutate(x = 2, value = value + 2), + ) %>% + as_epi_df(as_of = test_date + n, other_keys = "x") + } else { + df <- df %>% + as_epi_df(as_of = test_date + n) + } + df %>% + arrange_canonical() %>% + group_epi_df() } test_data <- get_test_dataset(num_rows_per_group, "day") -# TODO: Add a test that uses an 'other_key' grouping column. -# TODO: Add a case where the data contains NA values (not just gaps in time_value). - epi_slide_sum_test <- function( .x, - .window_size = 1, .align = "right", .ref_time_values = NULL, .all_rows = FALSE) { + .window_size = 7, .align = "right", .ref_time_values = NULL, .all_rows = FALSE) { + checkmate::assert_class(.x, "epi_df") + if (!(checkmate::test_integerish(.window_size, lower = 1, upper = Inf) || identical(as.numeric(.window_size), Inf))) { + cli::cli_abort("`.window_size` must be a positive integer or Inf.") + } + checkmate::assert_character(.align) + checkmate::assert_subset(.align, c("right", "center", "left")) + checkmate::assert( + checkmate::checkClass(.ref_time_values, "Date", null.ok = TRUE), + checkmate::checkClass(.ref_time_values, "yearmonth"), + checkmate::checkClass(.ref_time_values, "numeric") + ) + checkmate::assert_logical(.all_rows) + time_type <- attr(.x, "metadata")$time_type window_args <- get_before_after_from_window(.window_size, .align, time_type) date_seq_list <- full_date_seq(.x, window_args$before, window_args$after, time_type) if (is.null(.ref_time_values)) { .ref_time_values <- date_seq_list$all_dates } + group_keys <- setdiff(key_colnames(.x), "time_value") .x %>% mutate(.real = TRUE) %>% - group_by(geo_value) %>% + group_epi_df() %>% complete(time_value = vctrs::vec_c(!!!date_seq_list, .name_spec = rlang::zap())) %>% - arrange(geo_value, time_value) %>% + arrange_canonical() %>% + group_epi_df() %>% mutate( slide_value = slider::slide_index_sum( .data$value, @@ -83,7 +108,8 @@ epi_slide_sum_test <- function( } }) %>% filter(.real) %>% - select(-.real) + select(-.real) %>% + relocate(all_of(key_colnames(.x)), .before = 1) } concatenate_list_params <- function(p) { paste(paste0(names(p), "=", p), collapse = "\n") @@ -125,6 +151,7 @@ expect_equal_handle_null <- function(x, y) { # Core functionality tests across an exhaustive combination of parameters on # non-trivial data sets with three geo_groups, with non-identical time indices, # with missing time values, and with reported NA values. +# # .ref_time_values can be: # - NULL is a special case where we just use all the unique time_values in the # data. @@ -134,32 +161,49 @@ expect_equal_handle_null <- function(x, y) { # either empty or NA (depending if .all_rows is TRUE or not). # - c(8, 9) corresponds to test_date + 8 * units amd test_date + 9 * units. # In this case, groups a and b have values, but c does not. +# +# We filter down to reduce the number of combinations: +# - Since time_types only interact with .ref_time_values, we fix all the other +# parameters to a single common value. +# - We separate out .window_size=Inf, because it is only defined for +# .align="right". +# - We test .align and .all_rows separately, with a fixed .time_Type and +# .other_keys. param_combinations <- bind_rows( tidyr::expand_grid( .time_type = c("day", "week", "yearmonth", "integer"), + .other_keys = c(TRUE), .ref_time_values = list(NULL, c(1, 2), c(8, 9)), - .all_rows = c(FALSE, TRUE), - .align = c("right", "center", "left"), - .window_size = c(1, 7), + .all_rows = c(TRUE), + .align = c("right"), + .window_size = c(7), ), tidyr::expand_grid( .time_type = c("day", "week", "yearmonth", "integer"), + .other_keys = c(TRUE), .ref_time_values = list(NULL, c(1, 2), c(8, 9)), - .all_rows = c(FALSE, TRUE), + .all_rows = c(TRUE), .align = c("right"), .window_size = c(Inf), - ) + ), + tidyr::expand_grid( + .time_type = c("day"), + .other_keys = c(FALSE), + .ref_time_values = list(NULL, c(1, 2), c(8, 9)), + .all_rows = c(FALSE, TRUE), + .align = c("right", "center", "left"), + .window_size = c(7), + ), ) for (p in (param_combinations %>% transpose())) { - test_data <- get_test_dataset(num_rows_per_group, p$.time_type) + test_data <- get_test_dataset(num_rows_per_group, p$.time_type, p$.other_keys) units <- get_test_units(p$.time_type) test_date <- get_test_date(p$.time_type) p$.window_size <- p$.window_size * units if (!is.null(p$.ref_time_values)) { p$.ref_time_values <- test_date + units * p$.ref_time_values } - as_of <- attr(test_data, "metadata")$as_of - slide_args <- p[setdiff(names(p), c(".time_type"))] + slide_args <- p[setdiff(names(p), c(".time_type", ".other_keys"))] test_that( format_inline( @@ -202,8 +246,8 @@ for (p in (param_combinations %>% transpose())) { rowwise() %>% mutate(slide_value = list(slide_value)) %>% ungroup() %>% - as_epi_df(as_of = as_of) %>% - group_by(geo_value) + as_epi_df(as_of = attr(test_data, "metadata")$as_of, other_keys = attr(test_data, "metadata")$other_keys) %>% + group_epi_df() expect_equal( out %>% select(-slide_value), @@ -224,8 +268,8 @@ for (p in (param_combinations %>% transpose())) { rowwise() %>% mutate(slide_value = list(slide_value)) %>% ungroup() %>% - as_epi_df(as_of = as_of) %>% - group_by(geo_value) + as_epi_df(as_of = attr(test_data, "metadata")$as_of, other_keys = attr(test_data, "metadata")$other_keys) %>% + group_epi_df() expect_equal( out %>% select(-slide_value), expected_out %>% select(-slide_value) @@ -241,7 +285,7 @@ for (p in (param_combinations %>% transpose())) { ), { expected_out <- rlang::inject(epi_slide_sum_test(test_data, !!!slide_args)) - expect_equal_mod( + expect_equal( rlang::inject(epi_slide( test_data, , data.frame(slide_value = sum(.x$value)), !!!slide_args @@ -290,7 +334,6 @@ for (p in (param_combinations %>% transpose())) { ) } -# TODO: This. test_that(".window_size as integer works", { expect_equal( epi_slide(test_data, ~ sum(.x$value), .window_size = 7), @@ -320,11 +363,11 @@ for (bad_value in bad_values) { test_that(format_inline("epi_slide should fail when `.ref_time_values` is out of range for all groups "), { bad_values <- c(min(test_data$time_value) - 1, max(test_data$time_value) + 1) expect_error( - epi_slide(test_data, ~ sum(.x), .ref_time_values = bad_values), + epi_slide(test_data, ~ sum(.x), .ref_time_values = bad_values, .window_size = 7), class = "epiprocess__epi_slide_invalid_ref_time_values" ) expect_error( - epi_slide_mean(test_data, .col_names = value, .ref_time_values = bad_values), + epi_slide_mean(test_data, .col_names = value, .ref_time_values = bad_values, .window_size = 7), class = "epiprocess__epi_slide_opt_invalid_ref_time_values" ) }) @@ -332,14 +375,15 @@ test_that(format_inline("epi_slide should fail when `.ref_time_values` is out of test_that("epi_slide alerts if the provided f doesn't take enough args", { f_tib_avg_count <- function(x, g, t) dplyr::tibble(avg = mean(x$value), count = length(x$value)) expect_no_error( - epi_slide(test_data, f_tib_avg_count), + epi_slide(test_data, f_tib_avg_count, .window_size = 7), ) expect_no_warning( - epi_slide(test_data, f_tib_avg_count), + epi_slide(test_data, f_tib_avg_count, .window_size = 7), ) f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$value), count = length(x$value)) - expect_warning(epi_slide(test_data, f_x_dots), + expect_warning( + epi_slide(test_data, f_x_dots, .window_size = 7), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" ) }) @@ -347,19 +391,19 @@ test_that("epi_slide alerts if the provided f doesn't take enough args", { test_that("epi_slide computation via f can use ref_time_value", { expected_out <- test_data %>% mutate(slide_value = time_value) expect_equal( - test_data %>% epi_slide(~.ref_time_value), + epi_slide(test_data, ~.ref_time_value, .window_size = 7), expected_out ) expect_equal( - test_data %>% epi_slide(~.z), + epi_slide(test_data, ~.z, .window_size = 7), expected_out ) expect_equal( - test_data %>% epi_slide(~..3), + epi_slide(test_data, ~..3, .window_size = 7), expected_out ) expect_equal( - test_data %>% epi_slide(.f = function(x, g, t) t), + epi_slide(test_data, .f = function(x, g, t) t, .window_size = 7), expected_out ) }) @@ -367,66 +411,64 @@ test_that("epi_slide computation via f can use ref_time_value", { test_that("epi_slide computation via f can use group", { expected_out <- test_data %>% mutate(slide_value = geo_value) expect_equal( - test_data %>% epi_slide(~ .group_key$geo_value), + epi_slide(test_data, .f = ~ .group_key$geo_value, .window_size = 7), expected_out ) expect_equal( - test_data %>% epi_slide(~ .y$geo_value), + epi_slide(test_data, .f = ~ .y$geo_value, .window_size = 7), expected_out ) expect_equal( - test_data %>% epi_slide(~ ..2$geo_value), + epi_slide(test_data, .f = ~ ..2$geo_value, .window_size = 7), expected_out ) expect_equal( - test_data %>% epi_slide(.f = function(x, g, t) g$geo_value), + epi_slide(test_data, .f = function(x, g, t) g$geo_value, .window_size = 7), expected_out ) }) test_that("epi_slide computation via dots can use ref_time_value", { expect_equal( - test_data %>% epi_slide(slide_value = .ref_time_value), - test_data %>% mutate(slide_value = time_value) + epi_slide(test_data, slide_value = .ref_time_value, .window_size = 7), + mutate(test_data, slide_value = time_value) ) }) test_that("epi_slide computation via dots can use group", { expect_equal( - test_data %>% epi_slide(slide_value = nrow(.group_key)), - test_data %>% mutate(slide_value = 1L) + epi_slide(test_data, slide_value = nrow(.group_key), .window_size = 7), + mutate(test_data, slide_value = 1L) ) expect_equal( - test_data %>% epi_slide(slide_value = .group_key$geo_value), - test_data %>% mutate(slide_value = geo_value) + epi_slide(test_data, slide_value = .group_key$geo_value, .window_size = 7), + mutate(test_data, slide_value = geo_value) ) }) test_that("epi_slide computation should not allow access from .data and .env", { - expect_error(test_data %>% epi_slide(slide_value = .env$.ref_time_value)) - expect_error(test_data %>% epi_slide(slide_value = .data$.ref_time_value)) - expect_error(test_data %>% epi_slide(slide_value = .env$.group_key)) - expect_error(test_data %>% epi_slide(slide_value = .data$.group_key)) + expect_error(epi_slide(test_data, slide_value = .env$.ref_time_value, .window_size = 7)) + expect_error(epi_slide(test_data, slide_value = .data$.ref_time_value, .window_size = 7)) + expect_error(epi_slide(test_data, slide_value = .env$.group_key, .window_size = 7)) + expect_error(epi_slide(test_data, slide_value = .data$.group_key, .window_size = 7)) }) test_that("epi_slide computation via dots outputs the same result using col names and the data var", { - expected_output <- test_data %>% epi_slide(slide_value = max(time_value)) + expected_output <- epi_slide(test_data, slide_value = max(time_value), .window_size = 7) expect_equal( - test_data %>% epi_slide(slide_value = max(.x$time_value)), + epi_slide(test_data, slide_value = max(.x$time_value), .window_size = 7), expected_output ) expect_equal( - test_data %>% epi_slide(slide_value = max(.data$time_value)), + epi_slide(test_data, slide_value = max(.data$time_value), .window_size = 7), expected_output ) }) test_that("`epi_slide` can access objects inside of helper functions", { helper <- function(archive_haystack, time_value_needle) { - archive_haystack %>% epi_slide( - has_needle = time_value_needle %in% time_value, .window_size = Inf - ) + epi_slide(archive_haystack, has_needle = time_value_needle %in% time_value, .window_size = 7) } expect_no_error(helper(test_data, as.Date("2021-01-01"))) }) @@ -439,6 +481,7 @@ test_that("epi_slide can use sequential data masking expressions including NULL" ) %>% as_epi_df(as_of = 12L) + # TODO: Something's borked here. out1 <- edf_a %>% group_by(geo_value) %>% epi_slide( @@ -449,9 +492,9 @@ test_that("epi_slide can use sequential data masking expressions including NULL" m1 = NULL ) %>% ungroup() %>% - tidyr::drop_na() %>% as_epi_df(as_of = 12L) expect_equal(out1$m5, out1$derived_m5) + expect_true(!"m1" %in% names(out1)) out2 <- edf_a %>% group_by(geo_value) %>% @@ -469,34 +512,31 @@ test_that("epi_slide can use sequential data masking expressions including NULL" test_that("epi_slide complains on invalid computation outputs", { expect_error( - test_data %>% epi_slide(~ lm(value ~ time_value, .x)), + epi_slide(test_data, .f = ~ lm(value ~ time_value, .x), .window_size = 7), class = "epiprocess__invalid_slide_comp_value" ) expect_no_error( - test_data %>% epi_slide(~ list(lm(value ~ time_value, .x))), + epi_slide(test_data, .f = ~ list(lm(value ~ time_value, .x)), .window_size = 7), class = "epiprocess__invalid_slide_comp_value" ) expect_error( - test_data %>% epi_slide(model = lm(value ~ time_value, .x)), + epi_slide(test_data, model = lm(value ~ time_value, .x), .window_size = 7), class = "epiprocess__invalid_slide_comp_tidyeval_output" ) expect_no_error( - test_data %>% epi_slide(model = list(lm(value ~ time_value, .x))), + epi_slide(test_data, model = list(lm(value ~ time_value, .x)), .window_size = 7), class = "epiprocess__invalid_slide_comp_tidyeval_output" ) expect_error( - test_data %>% - epi_slide(.window_size = 6, ~ sum(.x$value) + c(0, 0, 0)), + epi_slide(test_data, .f = ~ sum(.x$value) + c(0, 0, 0), .window_size = 7), class = "epiprocess__invalid_slide_comp_value" ) expect_error( - test_data %>% - epi_slide(.window_size = 6, ~ as.list(sum(.x$value) + c(0, 0, 0))), + epi_slide(test_data, .f = ~ as.list(sum(.x$value) + c(0, 0, 0)), .window_size = 7), class = "epiprocess__invalid_slide_comp_value" ) expect_error( - test_data %>% - epi_slide(.window_size = 6, ~ data.frame(slide_value = sum(.x$value) + c(0, 0, 0))), + epi_slide(test_data, .f = ~ data.frame(slide_value = sum(.x$value) + c(0, 0, 0)), .window_size = 7), class = "epiprocess__invalid_slide_comp_value" ) }) @@ -505,7 +545,7 @@ test_that("epi_slide can use {nm} :=", { nm <- "slide_value" expect_identical( # unfortunately, we can't pass this directly as `f` and need an extra comma - test_data %>% epi_slide(, !!nm := sum(value), .window_size = 7), + epi_slide(test_data, , !!nm := sum(value), .window_size = 7), epi_slide_sum_test(test_data, .window_size = 7) ) }) @@ -700,14 +740,13 @@ test_that("`epi_slide_opt` errors when passed non-`data.table`, non-`slider` fun ) }) -multi_columns <- dplyr::bind_rows( - dplyr::tibble(geo_value = "ak", time_value = test_date + 1:200, value = 1:200, value2 = -1:-200), - dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), value2 = 1:5) -) %>% - as_epi_df() %>% - group_by(geo_value) - test_that("no dplyr warnings from selecting multiple columns", { + multi_columns <- dplyr::bind_rows( + dplyr::tibble(geo_value = "ak", time_value = test_date + 1:200, value = 1:200, value2 = -1:-200), + dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), value2 = 1:5) + ) %>% + as_epi_df() %>% + group_by(geo_value) expect_no_warning( multi_slid <- epi_slide_mean(multi_columns, .col_names = c("value", "value2"), .window_size = 7) ) From c167ddfbb8a96dd5869b37f8921175ca6eae38a6 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Tue, 17 Sep 2024 13:34:50 -0700 Subject: [PATCH 092/110] lint: line breaks --- R/slide.R | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/R/slide.R b/R/slide.R index df2e9c91..64e46386 100644 --- a/R/slide.R +++ b/R/slide.R @@ -366,10 +366,17 @@ epi_slide <- function( cli::format_error(c( "conflict detected between existing columns and slide computation output:", "i" = "pre-existing columns: {syms(names(res))}", - "x" = "slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't match the pre-existing value" + "x" = "slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't match the + pre-existing value" )), - capture.output(print(waldo::compare(res[[comp_nms[[comp_i]]]], slide_values[[comp_i]], x_arg = "existing", y_arg = "comp output"))), - cli::format_message(c("You likely want to rename or remove this column from your slide computation's output, or debug why it has a different value.")) + capture.output(print(waldo::compare( + res[[comp_nms[[comp_i]]]], slide_values[[comp_i]], + x_arg = "existing", y_arg = "comp output" + ))), + cli::format_message(c( + "You likely want to rename or remove this column from your slide computation's output, or + debug why it has a different value." + )) ) rlang::abort(paste(collapse = "\n", lines), class = "epiprocess__epi_slide_existing_vs_output_column_conflict" From f1abe173d862bc2ef228bc200ea7583d88e4dcff Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Tue, 17 Sep 2024 16:37:01 -0700 Subject: [PATCH 093/110] fix: leftover merge issue and test fix --- R/slide.R | 2 +- tests/testthat/test-epi_slide.R | 23 +++++------------------ 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/R/slide.R b/R/slide.R index 2c8fd6ab..77c7ae9c 100644 --- a/R/slide.R +++ b/R/slide.R @@ -236,7 +236,7 @@ epi_slide <- function( .f = function(.data_group, .group_key, ...) { epi_slide_one_group( .data_group, .group_key, ..., - .f_factory = slide_comp_wrapper_factory, + .slide_comp_factory = slide_comp_wrapper_factory, .before = window_args$before, .after = window_args$after, .ref_time_values = .ref_time_values, diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 8ee2ee80..7ca77ee2 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -381,7 +381,7 @@ test_that("epi_slide alerts if the provided f doesn't take enough args", { epi_slide(test_data, f_tib_avg_count, .window_size = 7), ) - f_x_dots <- function(x, ...) dplyr::tibble(value = mean(x$value), count = length(x$value)) + f_x_dots <- function(x, ...) dplyr::tibble(mean_value = mean(x$value), count = length(x$value)) expect_warning( epi_slide(test_data, f_x_dots, .window_size = 7), class = "epiprocess__assert_sufficient_f_args__mandatory_f_args_passed_to_f_dots" @@ -481,8 +481,7 @@ test_that("epi_slide can use sequential data masking expressions including NULL" ) %>% as_epi_df(as_of = 12L) - # TODO: Something's borked here. - out1 <- edf_a %>% + out <- edf_a %>% group_by(geo_value) %>% epi_slide( .window_size = 5L, .align = "center", @@ -493,21 +492,9 @@ test_that("epi_slide can use sequential data masking expressions including NULL" ) %>% ungroup() %>% as_epi_df(as_of = 12L) - expect_equal(out1$m5, out1$derived_m5) - expect_true(!"m1" %in% names(out1)) - - out2 <- edf_a %>% - group_by(geo_value) %>% - epi_slide( - .window_size = 5L, .align = "center", - m1 = list(.x$value[1]), - m5 = list(.x$value[5]), - derived_m5 = list(m1[[1]] + 4) - ) %>% - ungroup() %>% - filter(!is.na(m5)) %>% - as_epi_df(as_of = 12L) - expect_equal(out2$m5, out2$derived_m5) + na_mask <- !is.na(out$m5) & !is.na(out$derived_m5) + expect_equal(out$m5[na_mask], out$derived_m5[na_mask]) + expect_true(!"m1" %in% names(out)) }) test_that("epi_slide complains on invalid computation outputs", { From 409dcac35cfd0fe93e8d01bb28c498b174433575 Mon Sep 17 00:00:00 2001 From: dshemetov Date: Tue, 17 Sep 2024 23:38:42 +0000 Subject: [PATCH 094/110] docs: document (GHA) --- man/epi_slide.Rd | 6 ------ 1 file changed, 6 deletions(-) diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index cf27b983..70918f18 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -88,12 +88,6 @@ outside \code{.ref_time_values}; otherwise, there will be one row for each row i \code{.x} that had a \code{time_value} in \code{.ref_time_values}. Default is \code{FALSE}. The missing value marker is the result of \code{vctrs::vec_cast}ing \code{NA} to the type of the slide computation output.} - -\item{.complete_only}{Logical; if \code{TRUE}, only slide values that have a -complete window of \code{before} and \code{after} values are returned. If \code{FALSE}, the -function \code{f} may be given a reduced window size, commonly at the beginning -of the time series, but also possibly in the interior if the \code{time_value} -column has gaps (see \code{complete.epi_df()} to address the latter).} } \value{ An \code{epi_df} object given by appending one or more new columns to \code{.x}, From d2372f01b03c617f114a1fc7311bcad9ddf04222 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 18 Sep 2024 14:52:48 -0700 Subject: [PATCH 095/110] Better detection, messaging, docs on epi_slide output clashes Also move some things to @keywords internal to match some recent additions, though it's still a mix. --- R/slide.R | 49 ++++++++++++---------------- R/utils.R | 60 +++++++++++++++++++++++++++++++++-- man/epi_slide.Rd | 5 ++- man/format_chr_with_quotes.Rd | 1 + man/format_class_vec.Rd | 1 + man/format_tibble_row.Rd | 18 +++++++++++ man/format_varname.Rd | 19 +++++++++++ man/format_varnames.Rd | 22 +++++++++++++ man/paste_lines.Rd | 18 +++++++++++ man/wrap_symbolics.Rd | 42 ++++++++++++++++++++++++ man/wrap_varnames.Rd | 39 +++++++++++++++++++++++ 11 files changed, 240 insertions(+), 34 deletions(-) create mode 100644 man/format_tibble_row.Rd create mode 100644 man/format_varname.Rd create mode 100644 man/format_varnames.Rd create mode 100644 man/paste_lines.Rd create mode 100644 man/wrap_symbolics.Rd create mode 100644 man/wrap_varnames.Rd diff --git a/R/slide.R b/R/slide.R index 77c7ae9c..688b6ce0 100644 --- a/R/slide.R +++ b/R/slide.R @@ -34,9 +34,8 @@ #' @param .new_col_name String indicating the name of the new column that will #' contain the derivative values. The default is "slide_value" unless your #' slide computations output data frames, in which case they will be unpacked -#' into the constituent columns and those names used. Note that setting -#' `.new_col_name` equal to an existing column name will overwrite this -#' column. +#' into the constituent columns and those names used. New columns should not +#' be given names that clash with the existing columns of `.x`; see details. #' #' @template basic-slide-details #' @@ -182,21 +181,12 @@ epi_slide <- function( assert_character(.new_col_name, null.ok = TRUE) if (!is.null(.new_col_name)) { - if (.new_col_name %in% group_vars(.x)) { - cli_abort(c("`.new_col_name` must not be one of the grouping column name(s); - `epi_slide()` uses these column name(s) to label what group - each slide computation came from.", - "i" = "{cli::qty(length(group_vars(.x)))} grouping column name{?s} - {?was/were} {format_chr_with_quotes(group_vars(.x))}", - "x" = "`.new_col_name` was {format_chr_with_quotes(.new_col_name)}" + if (.new_col_name %in% names(.x)) { + cli_abort(c("`.new_col_name` cannot overlap with existing column names", + "x" = "{sym(.new_col_name)} already exists in `.x`", + ">" = "Try using a different `.new_col_name` instead." )) } - if (any(.new_col_name %in% c("geo_value", "time_value"))) { - cli_abort( - "epi_slide: `.new_col_name` cannot be one of 'geo_value' or 'time_value'.", - class = "epiprocess__epi_slide_invalid_new_col_name" - ) - } } assert_logical(.all_rows, len = 1) @@ -406,18 +396,20 @@ epi_slide_one_group <- function( if (!identical(slide_values[[comp_i]], res[[comp_nms[[comp_i]]]])) { lines <- c( cli::format_error(c( - "conflict detected between existing columns and slide computation output:", - "i" = "pre-existing columns: {syms(names(res))}", - "x" = "slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't match the - pre-existing value" + "New column and old column clash", + "x" = "slide computation output included a + {format_varname(comp_nms[[comp_i]])} column, but `.x` already had a + {format_varname(comp_nms[[comp_i]])} column with differing values", + "Here are examples of differing values, where the grouping variables were + {format_tibble_row(.group_key)}:" )), capture.output(print(waldo::compare( res[[comp_nms[[comp_i]]]], slide_values[[comp_i]], x_arg = "existing", y_arg = "comp output" ))), cli::format_message(c( - "You likely want to rename or remove this column from your slide computation's output, or - debug why it has a different value." + ">" = "You likely want to rename or remove this column from your slide + computation's output, or debug why it has a different value." )) ) rlang::abort(paste(collapse = "\n", lines), @@ -431,15 +423,16 @@ epi_slide_one_group <- function( res <- bind_cols(res, slide_values[!overlaps_existing_names]) } else { # Apply default name (to vector or packed data.frame-type column): + if ("slide_value" %in% names(res)) { + cli_abort(c("Cannot guess a good column name for your output", + "x" = "`slide_value` already exists in `.x`", + ">" = "Please provide a `.new_col_name`." + )) + } res[["slide_value"]] <- slide_values - # TODO check for bizarre conflicting `slide_value` existing col name. - # Either here or on entry to `epi_slide` (even if there we don't know - # whether vecs will be output). Or just turn this into a special case of - # the preceding branch and let the checking code there generate a - # complaint. } } else { - # vector or packed data.frame-type column (note: overlaps with existing + # Vector or packed data.frame-type column (note: overlaps with existing # column names should already be forbidden by earlier validation): res[[.new_col_name]] <- slide_values } diff --git a/R/utils.R b/R/utils.R index 87d32823..d627f0bb 100644 --- a/R/utils.R +++ b/R/utils.R @@ -22,7 +22,7 @@ #' `initial` is long or the printing width is very narrow. #' @return `chr`; to print, use [`base::writeLines`]. #' -#' @noRd +#' @keywords internal wrap_symbolics <- function(symbolics, initial = "", common_prefix = "", none_str = "", width = getOption("width", 80L)) { @@ -69,7 +69,7 @@ wrap_symbolics <- function(symbolics, #' @inheritParams wrap_symbolics #' @return `chr`; to print, use [`base::writeLines`]. #' -#' @noRd +#' @keywords internal wrap_varnames <- function(nms, initial = "", common_prefix = "", none_str = "", width = getOption("width", 80L)) { @@ -84,7 +84,7 @@ wrap_varnames <- function(nms, #' @param lines `chr` #' @return string #' -#' @noRd +#' @keywords internal paste_lines <- function(lines) { paste(paste0(lines, "\n"), collapse = "") } @@ -93,6 +93,7 @@ paste_lines <- function(lines) { #' #' @param class_vec `chr`; output of `class(object)` for some `object` #' @return string +#' @keywords internal format_class_vec <- function(class_vec) { paste(collapse = "", deparse(class_vec)) } @@ -102,6 +103,7 @@ format_class_vec <- function(class_vec) { #' @param x `chr`; e.g., `colnames` of some data frame #' @param empty string; what should be output if `x` is of length 0? #' @return string +#' @keywords internal format_chr_with_quotes <- function(x, empty = "*none*") { if (length(x) == 0L) { empty @@ -119,6 +121,58 @@ format_chr_with_quotes <- function(x, empty = "*none*") { } } +#' "Format" a character vector of column/variable names for cli interpolation +#' +#' Designed to give good output if interpolated with cli. Main purpose is to add +#' backticks around variable names when necessary, and something other than an +#' empty string if length 0. +#' +#' @param x `chr`; e.g., `colnames` of some data frame +#' @param empty string; what should be output if `x` is of length 0? +#' @return `chr` +#' @keywords internal +format_varnames <- function(x, empty = "*none*") { + if (length(x) == 0L) { + empty + } else { + as.character(syms(x)) + } +} + +#' "Format" column/variable name for cli interpolation +#' +#' Designed to give good output if interpolated with cli. Main purpose is to add +#' backticks around variable names when necessary. +#' +#' @param x string; e.g., a colname +#' @return string +#' @keywords internal +format_varname <- function(x) { + # `syms` provides backticks if necessary; `sym` does not + as.character(syms(x)) +} + +#' Format a tibble row as chr +#' +#' @param x a tibble with a single row +#' @return `chr` with one entry per column, of form " = " +#' @keywords internal +format_tibble_row <- function(x, empty = "*none*") { + if (length(x) == 0L) { + empty + } else { + formatted_names <- as.character(syms(names(bindings))) + # Deparse values (e.g., surround strings with quotes & escaping) so this + # can be more easily copy-paste-edited into a `dplyr::filter` for + # debugging. + formatted_values <- map_chr(bindings, function(binding_value) { + paste(collapse = " ", deparse(binding_value)) + }) + formatted_bindings <- paste(formatted_names, "=", formatted_values) + formatted_bindings + } +} + #' Assert that a sliding computation function takes enough args #' #' @param f Function; specifies a computation to slide over an `epi_df` or diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index 70918f18..323fdf4d 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -77,9 +77,8 @@ underlying data table, by default.} \item{.new_col_name}{String indicating the name of the new column that will contain the derivative values. The default is "slide_value" unless your slide computations output data frames, in which case they will be unpacked -into the constituent columns and those names used. Note that setting -\code{.new_col_name} equal to an existing column name will overwrite this -column.} +into the constituent columns and those names used. New columns should not +be given names that clash with the existing columns of \code{.x}; see details.} \item{.all_rows}{If \code{.all_rows = TRUE}, then all rows of \code{.x} will be kept in the output even with \code{.ref_time_values} provided, with some type of missing diff --git a/man/format_chr_with_quotes.Rd b/man/format_chr_with_quotes.Rd index b62b172e..49beffb0 100644 --- a/man/format_chr_with_quotes.Rd +++ b/man/format_chr_with_quotes.Rd @@ -17,3 +17,4 @@ string \description{ Format a character vector as a string via deparsing/quoting each } +\keyword{internal} diff --git a/man/format_class_vec.Rd b/man/format_class_vec.Rd index b2b96678..2c7ae4b7 100644 --- a/man/format_class_vec.Rd +++ b/man/format_class_vec.Rd @@ -15,3 +15,4 @@ string \description{ Format a class vector as a string via deparsing it } +\keyword{internal} diff --git a/man/format_tibble_row.Rd b/man/format_tibble_row.Rd new file mode 100644 index 00000000..c43bd4a9 --- /dev/null +++ b/man/format_tibble_row.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{format_tibble_row} +\alias{format_tibble_row} +\title{Format a tibble row as chr} +\usage{ +format_tibble_row(x, empty = "*none*") +} +\arguments{ +\item{x}{a tibble with a single row} +} +\value{ +\code{chr} with one entry per column, of form "\if{html}{\out{}} = \if{html}{\out{}}" +} +\description{ +Format a tibble row as chr +} +\keyword{internal} diff --git a/man/format_varname.Rd b/man/format_varname.Rd new file mode 100644 index 00000000..fa9d3583 --- /dev/null +++ b/man/format_varname.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{format_varname} +\alias{format_varname} +\title{"Format" column/variable name for cli interpolation} +\usage{ +format_varname(x) +} +\arguments{ +\item{x}{string; e.g., a colname} +} +\value{ +string +} +\description{ +Designed to give good output if interpolated with cli. Main purpose is to add +backticks around variable names when necessary. +} +\keyword{internal} diff --git a/man/format_varnames.Rd b/man/format_varnames.Rd new file mode 100644 index 00000000..d25eb713 --- /dev/null +++ b/man/format_varnames.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{format_varnames} +\alias{format_varnames} +\title{"Format" a character vector of column/variable names for cli interpolation} +\usage{ +format_varnames(x, empty = "*none*") +} +\arguments{ +\item{x}{\code{chr}; e.g., \code{colnames} of some data frame} + +\item{empty}{string; what should be output if \code{x} is of length 0?} +} +\value{ +\code{chr} +} +\description{ +Designed to give good output if interpolated with cli. Main purpose is to add +backticks around variable names when necessary, and something other than an +empty string if length 0. +} +\keyword{internal} diff --git a/man/paste_lines.Rd b/man/paste_lines.Rd new file mode 100644 index 00000000..bab1e90b --- /dev/null +++ b/man/paste_lines.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{paste_lines} +\alias{paste_lines} +\title{Paste \code{chr} entries (lines) together with \code{"\\n"} separators, trailing \code{"\\n"}} +\usage{ +paste_lines(lines) +} +\arguments{ +\item{lines}{\code{chr}} +} +\value{ +string +} +\description{ +Paste \code{chr} entries (lines) together with \code{"\\n"} separators, trailing \code{"\\n"} +} +\keyword{internal} diff --git a/man/wrap_symbolics.Rd b/man/wrap_symbolics.Rd new file mode 100644 index 00000000..cfee2dcf --- /dev/null +++ b/man/wrap_symbolics.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{wrap_symbolics} +\alias{wrap_symbolics} +\title{Line wrap list holding \link[rlang:is_expression]{symbolic}, with prefix&indent} +\usage{ +wrap_symbolics( + symbolics, + initial = "", + common_prefix = "", + none_str = "", + width = getOption("width", 80L) +) +} +\arguments{ +\item{symbolics}{List of \link[rlang:is_expression]{symbolic} objects: the variable +names (potentially empty)} + +\item{initial}{Optional; single string: a prefix for the initial line in the +result; e.g., "Variable names: ". Defaults to "". Any non-initial lines +will be indented with whitespace matching the (estimated) visual width of +\code{initial}.} + +\item{common_prefix}{Optional; single string: a prefix for every line (will +appear before \code{initial}); e.g., "# ". Defaults to "".} + +\item{none_str}{Optional; single string: what to display when given +\code{length}-0 input. Will be combined with \code{common_prefix} and \code{initial}.} + +\item{width}{Optional; single integer: desired maximum formatted line width. +The formatted output may not obey this setting if \code{common_prefix} plus +\code{initial} is long or the printing width is very narrow.} +} +\value{ +\code{chr}; to print, use \code{\link[base:writeLines]{base::writeLines}}. +} +\description{ +Helps pretty-print these objects. Adds backticks, commas, prefixes, and +indentation. Wraps lines, but won't insert line breaks in the middle of any +name while doing so. +} +\keyword{internal} diff --git a/man/wrap_varnames.Rd b/man/wrap_varnames.Rd new file mode 100644 index 00000000..8c3e1246 --- /dev/null +++ b/man/wrap_varnames.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{wrap_varnames} +\alias{wrap_varnames} +\title{Line wrap \code{chr} holding variable/column/other names, with prefix&indent} +\usage{ +wrap_varnames( + nms, + initial = "", + common_prefix = "", + none_str = "", + width = getOption("width", 80L) +) +} +\arguments{ +\item{nms}{Character vector: the variable names (potentially empty)} + +\item{initial}{Optional; single string: a prefix for the initial line in the +result; e.g., "Variable names: ". Defaults to "". Any non-initial lines +will be indented with whitespace matching the (estimated) visual width of +\code{initial}.} + +\item{common_prefix}{Optional; single string: a prefix for every line (will +appear before \code{initial}); e.g., "# ". Defaults to "".} + +\item{none_str}{Optional; single string: what to display when given +\code{length}-0 input. Will be combined with \code{common_prefix} and \code{initial}.} + +\item{width}{Optional; single integer: desired maximum formatted line width. +The formatted output may not obey this setting if \code{common_prefix} plus +\code{initial} is long or the printing width is very narrow.} +} +\value{ +\code{chr}; to print, use \code{\link[base:writeLines]{base::writeLines}}. +} +\description{ +Line wrap \code{chr} holding variable/column/other names, with prefix&indent +} +\keyword{internal} From 166b8c3c4eac17e20a1a86708e9df2969a6f53cc Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Wed, 18 Sep 2024 15:35:12 -0700 Subject: [PATCH 096/110] Fix partial rename --- R/utils.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/R/utils.R b/R/utils.R index d627f0bb..8024712a 100644 --- a/R/utils.R +++ b/R/utils.R @@ -161,15 +161,15 @@ format_tibble_row <- function(x, empty = "*none*") { if (length(x) == 0L) { empty } else { - formatted_names <- as.character(syms(names(bindings))) + formatted_names <- as.character(syms(names(x))) # Deparse values (e.g., surround strings with quotes & escaping) so this # can be more easily copy-paste-edited into a `dplyr::filter` for # debugging. - formatted_values <- map_chr(bindings, function(binding_value) { + formatted_values <- map_chr(x, function(binding_value) { paste(collapse = " ", deparse(binding_value)) }) - formatted_bindings <- paste(formatted_names, "=", formatted_values) - formatted_bindings + formatted_x <- paste(formatted_names, "=", formatted_values) + formatted_x } } From 82047a4425deb8bb9e7133978273adf2864b767a Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 18 Sep 2024 15:36:38 -0700 Subject: [PATCH 097/110] lint: lint --- R/epi_df_forbidden_methods.R | 6 +++--- R/grouped_epi_archive.R | 11 ++++++++--- R/methods-epi_df.R | 9 ++++++--- R/slide.R | 10 +++++----- tests/testthat/test-epi_slide.R | 13 ++++++------- tests/testthat/test-utils.R | 5 ++++- 6 files changed, 32 insertions(+), 22 deletions(-) diff --git a/R/epi_df_forbidden_methods.R b/R/epi_df_forbidden_methods.R index 254713d6..86997daa 100644 --- a/R/epi_df_forbidden_methods.R +++ b/R/epi_df_forbidden_methods.R @@ -22,10 +22,10 @@ mean.epi_df <- function(x, ...) { # slide operations (sum, prod, min, max, all, any, range): #' @export -Summary.epi_df <- function(..., na.rm = FALSE) { +Summary.epi_df <- function(..., na.rm = FALSE) { # nolint: object_name_linter # cli uses dot prefixes for special purpose; use alias to avoid confusion during interpolation - generic <- .Generic - opt_pointer <- switch(.Generic, + generic <- .Generic # nolint: object_usage_linter + opt_pointer <- switch(generic, # nolint: object_usage_linter sum = "You may also prefer to use the specialized `epi_slide_sum` method.", prod = , min = , diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 7e11e468..b26c55f3 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -382,10 +382,15 @@ epix_slide.grouped_epi_archive <- function( cli::format_error(c( "conflict detected between slide value computation labels and output:", "i" = "we are labeling slide computations with the following columns: {syms(names(res))}", - "x" = "a slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't match the label" + "x" = "a slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't + match the label" )), - capture.output(print(waldo::compare(res[[comp_nms[[comp_i]]]], comp_value[[comp_i]], x_arg = "label", y_arg = "comp output"))), - cli::format_message(c("You likely want to rename or remove this column in your output, or debug why it has a different value.")) + capture.output(print( + waldo::compare(res[[comp_nms[[comp_i]]]], comp_value[[comp_i]], x_arg = "label", y_arg = "comp output") + )), + cli::format_message(c( + "You likely want to rename or remove this column in your output, or debug why it has a different value." + )) ) rlang::abort(paste(collapse = "\n", lines), class = "epiprocess__epix_slide_label_vs_output_column_conflict" diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index 9dc2d06e..c859f249 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -400,7 +400,8 @@ arrange_row_canonical.default <- function(x, ...) { #' @export arrange_row_canonical.epi_df <- function(x, ...) { rlang::check_dots_empty() - x %>% dplyr::arrange(dplyr::across(dplyr::all_of(key_colnames(.)))) + cols <- key_colnames(x) + x %>% dplyr::arrange(dplyr::across(dplyr::all_of(cols))) } arrange_col_canonical <- function(x, ...) { @@ -419,12 +420,14 @@ arrange_col_canonical.default <- function(x, ...) { #' @export arrange_col_canonical.epi_df <- function(x, ...) { rlang::check_dots_empty() - x %>% dplyr::relocate(dplyr::all_of(key_colnames(.)), .before = 1) + cols <- key_colnames(x) + x %>% dplyr::relocate(dplyr::all_of(cols), .before = 1) } #' @export group_epi_df <- function(x) { - x %>% group_by(across(all_of(kill_time_value(key_colnames(.))))) + cols <- kill_time_value(key_colnames(x)) + x %>% group_by(across(all_of(cols))) } #' Aggregate an `epi_df` object diff --git a/R/slide.R b/R/slide.R index 688b6ce0..5342a527 100644 --- a/R/slide.R +++ b/R/slide.R @@ -241,14 +241,14 @@ epi_slide <- function( .keep = TRUE ) %>% bind_rows() %>% - filter(.real) %>% - select(-.real) %>% + filter(.data$.real) %>% + select(-data$.real) %>% arrange_col_canonical() %>% group_by(!!!.x_groups) # If every group in epi_slide_one_group takes the # length(available_ref_time_values) == 0 branch then we end up here. - if (ncol(result) == ncol(.x %>% select(-.real))) { + if (ncol(result) == ncol(.x %>% select(-data$.real))) { cli_abort( "epi_slide: no new columns were created. This can happen if every group has no available ref_time_values. This is likely a mistake in your data, in the slide computation, or in the ref_time_values argument.", @@ -799,8 +799,8 @@ epi_slide_opt <- function( result <- mutate(.x, .real = TRUE) %>% group_modify(slide_one_grp, ..., .keep = FALSE) %>% - filter(.real) %>% - select(-.real) %>% + filter(.data$.real) %>% + select(-.data$.real) %>% arrange_col_canonical() if (.all_rows) { diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 7ca77ee2..358452f8 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -38,13 +38,13 @@ get_test_dataset <- function(n, time_type = "day", other_keys = FALSE) { "b", test_date + units * 0:n_, (10 * n + values)**2, "c", test_date + units * (floor(n / 2) + 0:n_), (100 * n + values)**2, ) %>% - tidyr::unnest_longer(c(time_value, value)) %>% + tidyr::unnest_longer(c("time_value", "value")) %>% slice(-10) if (other_keys) { df <- bind_rows( - df %>% mutate(x = 1, value = value + 1), - df %>% mutate(x = 2, value = value + 2), + df %>% mutate(x = 1, value = .data$value + 1), + df %>% mutate(x = 2, value = .data$value + 2), ) %>% as_epi_df(as_of = test_date + n, other_keys = "x") } else { @@ -79,7 +79,6 @@ epi_slide_sum_test <- function( if (is.null(.ref_time_values)) { .ref_time_values <- date_seq_list$all_dates } - group_keys <- setdiff(key_colnames(.x), "time_value") .x %>% mutate(.real = TRUE) %>% @@ -107,7 +106,7 @@ epi_slide_sum_test <- function( dplyr::filter(., time_value %in% available_ref_time_values) } }) %>% - filter(.real) %>% + dplyr::filter(.real) %>% select(-.real) %>% relocate(all_of(key_colnames(.x)), .before = 1) } @@ -143,8 +142,8 @@ test_that("is_null_or_na works", { expect_equal_handle_null <- function(x, y) { x_na_mask <- purrr::map_lgl(x, is_null_or_na) y_na_mask <- purrr::map_lgl(y, is_null_or_na) - expect_equal(x_na_mask, y_na_mask) - expect_equal(x[!x_na_mask], y[!y_na_mask]) + testthat::expect_equal(x_na_mask, y_na_mask) + testthat::expect_equal(x[!x_na_mask], y[!y_na_mask]) } diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index f3cd743e..9135e5a9 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -155,7 +155,10 @@ test_that("assert_sufficient_f_args alerts if the provided f has defaults for th # forwarding named dots should prevent some complaints: expect_no_error(assert_sufficient_f_args(f_xsgt, setting = "b", .ref_time_value_label = "reference time value")) expect_no_error(assert_sufficient_f_args(f_xsgt_dots, setting = "b", .ref_time_value_label = "reference time value")) - expect_error(suppressWarnings(assert_sufficient_f_args(f_xs_dots, setting = "b", .ref_time_value_label = "reference time value")), + expect_error( + suppressWarnings( + assert_sufficient_f_args(f_xs_dots, setting = "b", .ref_time_value_label = "reference time value") + ), regexp = "pass the window data to `\\.f`'s x argument", class = "epiprocess__assert_sufficient_f_args__required_args_contain_defaults" ) From 46af707c224ecb8d86f6aad194d281aab82c040b Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 19 Sep 2024 15:31:22 -0700 Subject: [PATCH 098/110] Make format_tibble_row look better on time classes Don't use deparse approach for now as it outputs ugly things like `structure(..........)` for multiple time classes and probably other classes. In the future, we may want to do something like a backport of deparse1 + special cases for time&other classes, for easier copy-paste for debugging while keeping readability. --- R/utils.R | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/R/utils.R b/R/utils.R index 8024712a..c40265ea 100644 --- a/R/utils.R +++ b/R/utils.R @@ -162,11 +162,8 @@ format_tibble_row <- function(x, empty = "*none*") { empty } else { formatted_names <- as.character(syms(names(x))) - # Deparse values (e.g., surround strings with quotes & escaping) so this - # can be more easily copy-paste-edited into a `dplyr::filter` for - # debugging. formatted_values <- map_chr(x, function(binding_value) { - paste(collapse = " ", deparse(binding_value)) + paste(collapse = "\n", format(binding_value)) }) formatted_x <- paste(formatted_names, "=", formatted_values) formatted_x From 177e7cc9bc433cb18444270b95a898e41840b62b Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 19 Sep 2024 15:44:47 -0700 Subject: [PATCH 099/110] Improve slide output column conflict messages --- R/grouped_epi_archive.R | 23 +++++++++++++++-------- R/slide.R | 5 +++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index b26c55f3..1984dae2 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -380,20 +380,27 @@ epix_slide.grouped_epi_archive <- function( if (!identical(comp_value[[comp_i]], res[[comp_nms[[comp_i]]]])) { lines <- c( cli::format_error(c( - "conflict detected between slide value computation labels and output:", - "i" = "we are labeling slide computations with the following columns: {syms(names(res))}", - "x" = "a slide computation output included a column {syms(comp_nms[[comp_i]])} that didn't - match the label" - )), - capture.output(print( - waldo::compare(res[[comp_nms[[comp_i]]]], comp_value[[comp_i]], x_arg = "label", y_arg = "comp output") + "New column and labeling column clash", + "i" = "`epix_slide` is attaching labeling columns + {format_varnames(names(res))}", + "x" = "slide computation output included a + {format_varname(comp_nms[[comp_i]])} column, but it + didn't match the labeling column", + "i" = "Here are examples of differing values, for a computation + where the labels were: + {format_tibble_row(as_tibble(res)[1L,])}:" )), + capture.output(print(waldo::compare( + res[[comp_nms[[comp_i]]]], comp_value[[comp_i]], + x_arg = rlang::expr_deparse(expr(`$`(label, !!sym(comp_nms[[comp_i]])))), + y_arg = rlang::expr_deparse(expr(`$`(comp_value, !!sym(comp_nms[[comp_i]])))) + ))), cli::format_message(c( "You likely want to rename or remove this column in your output, or debug why it has a different value." )) ) rlang::abort(paste(collapse = "\n", lines), - class = "epiprocess__epix_slide_label_vs_output_column_conflict" + class = "epiprocess__epix_slide_output_vs_label_column_conflict" ) } } diff --git a/R/slide.R b/R/slide.R index 5342a527..c6a9e3be 100644 --- a/R/slide.R +++ b/R/slide.R @@ -405,7 +405,8 @@ epi_slide_one_group <- function( )), capture.output(print(waldo::compare( res[[comp_nms[[comp_i]]]], slide_values[[comp_i]], - x_arg = "existing", y_arg = "comp output" + x_arg = rlang::expr_deparse(expr(`$`(existing, !!sym(comp_nms[[comp_i]])))), + y_arg = rlang::expr_deparse(expr(`$`(comp_value, !!sym(comp_nms[[comp_i]])))) ))), cli::format_message(c( ">" = "You likely want to rename or remove this column from your slide @@ -413,7 +414,7 @@ epi_slide_one_group <- function( )) ) rlang::abort(paste(collapse = "\n", lines), - class = "epiprocess__epi_slide_existing_vs_output_column_conflict" + class = "epiprocess__epi_slide_output_vs_existing_column_conflict" ) } } From bde98ec6d4937a7e153e6da28af323cbfcb8086f Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Thu, 19 Sep 2024 16:01:42 -0700 Subject: [PATCH 100/110] Fix data$ typo, avoid `.data$` in tidyselections Modern tidyselect distinguishes itself from data masking and prefers not having .data$, so just drop it. Attempt to appease linter with more globalVariables(). --- R/epiprocess.R | 3 ++- R/slide.R | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/R/epiprocess.R b/R/epiprocess.R index 0507e25d..422ff304 100644 --- a/R/epiprocess.R +++ b/R/epiprocess.R @@ -16,5 +16,6 @@ "_PACKAGE" utils::globalVariables(c( ".x", ".group_key", ".ref_time_value", "resid", - "fitted", ".response", "geo_value", "time_value" + "fitted", ".response", "geo_value", "time_value", + ".real" )) diff --git a/R/slide.R b/R/slide.R index c6a9e3be..27e7a9d1 100644 --- a/R/slide.R +++ b/R/slide.R @@ -242,13 +242,13 @@ epi_slide <- function( ) %>% bind_rows() %>% filter(.data$.real) %>% - select(-data$.real) %>% + select(-.real) %>% arrange_col_canonical() %>% group_by(!!!.x_groups) # If every group in epi_slide_one_group takes the # length(available_ref_time_values) == 0 branch then we end up here. - if (ncol(result) == ncol(.x %>% select(-data$.real))) { + if (ncol(result) == ncol(.x %>% select(-.real))) { cli_abort( "epi_slide: no new columns were created. This can happen if every group has no available ref_time_values. This is likely a mistake in your data, in the slide computation, or in the ref_time_values argument.", @@ -801,7 +801,7 @@ epi_slide_opt <- function( result <- mutate(.x, .real = TRUE) %>% group_modify(slide_one_grp, ..., .keep = FALSE) %>% filter(.data$.real) %>% - select(-.data$.real) %>% + select(-.real) %>% arrange_col_canonical() if (.all_rows) { From 48735c59c61adcfa4ab7caa18ac0a45479618e8b Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Thu, 19 Sep 2024 13:07:16 -0700 Subject: [PATCH 101/110] lint: more lint --- R/epiprocess.R | 2 +- R/slide.R | 2 +- R/utils.R | 2 +- tests/testthat/test-epi_slide.R | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/R/epiprocess.R b/R/epiprocess.R index 422ff304..5c76f882 100644 --- a/R/epiprocess.R +++ b/R/epiprocess.R @@ -17,5 +17,5 @@ utils::globalVariables(c( ".x", ".group_key", ".ref_time_value", "resid", "fitted", ".response", "geo_value", "time_value", - ".real" + "value", ".real" )) diff --git a/R/slide.R b/R/slide.R index 27e7a9d1..192597da 100644 --- a/R/slide.R +++ b/R/slide.R @@ -421,7 +421,7 @@ epi_slide_one_group <- function( # Unpack into separate columns (without name prefix). If there are # columns duplicating existing columns, de-dupe and order them as if they # didn't exist in slide_values. - res <- bind_cols(res, slide_values[!overlaps_existing_names]) + res <- dplyr::bind_cols(res, slide_values[!overlaps_existing_names]) } else { # Apply default name (to vector or packed data.frame-type column): if ("slide_value" %in% names(res)) { diff --git a/R/utils.R b/R/utils.R index c40265ea..17d59eca 100644 --- a/R/utils.R +++ b/R/utils.R @@ -162,7 +162,7 @@ format_tibble_row <- function(x, empty = "*none*") { empty } else { formatted_names <- as.character(syms(names(x))) - formatted_values <- map_chr(x, function(binding_value) { + formatted_values <- purrr::map_chr(x, function(binding_value) { paste(collapse = "\n", format(binding_value)) }) formatted_x <- paste(formatted_names, "=", formatted_values) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index 358452f8..e8416693 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -106,7 +106,7 @@ epi_slide_sum_test <- function( dplyr::filter(., time_value %in% available_ref_time_values) } }) %>% - dplyr::filter(.real) %>% + dplyr::filter(.data$.real) %>% select(-.real) %>% relocate(all_of(key_colnames(.x)), .before = 1) } From 227e13336b6155e965d97b7f0c094e69abbd095f Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Thu, 19 Sep 2024 16:11:44 -0700 Subject: [PATCH 102/110] fix: .ref_time_values -> .versions in epix_slide and some doc fixes --- R/archive.R | 2 +- R/grouped_epi_archive.R | 13 ++++++++++--- R/methods-epi_archive.R | 12 ++++++------ vignettes/advanced.Rmd | 4 ++-- vignettes/archive.Rmd | 6 +++--- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/R/archive.R b/R/archive.R index 07394d9d..e877d397 100644 --- a/R/archive.R +++ b/R/archive.R @@ -626,7 +626,7 @@ print.epi_archive <- function(x, ..., class = TRUE, methods = TRUE) { #' epix_slide( #' .f = ~ mean(.x$case_rate_7d_av), #' .before = 2, -#' .ref_time_values = as.Date("2020-06-11") + 0:2, +#' .versions = as.Date("2020-06-11") + 0:2, #' .new_col_name = "case_rate_3d_av" #' ) %>% #' ungroup() diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 1984dae2..3bcb7254 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -224,13 +224,20 @@ epix_slide.grouped_epi_archive <- function( # early development versions and much more likely to be clutter than # informative in the signature. provided_args <- rlang::call_args_names(rlang::call_match()) - if (any(provided_args %in% c("x", "f", "before", "ref_time_values", "new_col_name", "all_versions"))) { + if (any(provided_args %in% c( + "x", "f", "before", "new_col_name", "all_versions", + ))) { cli::cli_abort( - "epix_slide: you are using one of the following old argument names: `x`, `f`, `before`, `ref_time_values`, - `new_col_name`, `all_versions`. Please use the new names: `.x`, `.f`, `.before`, `.ref_time_values`, + "epix_slide: you are using one of the following old argument names: `x`, `f`, `before`, + `new_col_name`, `all_versions`. Please use the new names: `.x`, `.f`, `.before`, `.new_col_name`, `.all_versions`." ) } + if (any(provided_args %in% c("ref_time_values", ".ref_time_values"))) { + cli::cli_abort( + "epix_slide: the argument `ref_time_values` is deprecated. Please use `.versions` instead." + ) + } if ("group_by" %in% provided_args) { cli_abort(" The `group_by` argument to `slide` has been removed; please use diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index 7ea47a1e..be34211b 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -654,7 +654,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' in the archive is "day", and the `.ref_time_value` is January 8, then the #' smallest time_value in the snapshot will be January 1. If missing, then the #' default is no limit on the time values, so the full snapshot is given. -#' @param .ref_time_values Reference time values / versions for sliding +#' @param .versions Reference time values / versions for sliding #' computations; each element of this vector serves both as the anchor point #' for the `time_value` window for the computation and the `max_version` #' `epix_as_of` which we fetch data in this window. If missing, then this will @@ -712,7 +712,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' computations are allowed more flexibility in their outputs than in #' `epi_slide`, we can't guess a good representation for missing computations #' for excluded group-`.ref_time_value` pairs. -#' 76. The `.ref_time_values` default for `epix_slide` is based on making an +#' 76. The `.versions` default for `epix_slide` is based on making an #' evenly-spaced sequence out of the `version`s in the `DT` plus the #' `versions_end`, rather than the `time_value`s. #' @@ -731,7 +731,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' library(dplyr) #' #' # Reference time points for which we want to compute slide values: -#' ref_time_values <- seq(as.Date("2020-06-01"), +#' versions <- seq(as.Date("2020-06-01"), #' as.Date("2020-06-15"), #' by = "1 day" #' ) @@ -743,7 +743,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' epix_slide( #' .f = ~ mean(.x$case_rate_7d_av), #' .before = 2, -#' .ref_time_values = ref_time_values, +#' .versions = versions, #' .new_col_name = "case_rate_7d_av_recent_av" #' ) %>% #' ungroup() @@ -777,7 +777,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' ) #' }, #' .before = 5, .all_versions = FALSE, -#' .ref_time_values = ref_time_values +#' .versions = versions #' ) %>% #' ungroup() %>% #' arrange(geo_value, time_value) @@ -812,7 +812,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' ) #' }, #' .before = 5, .all_versions = TRUE, -#' .ref_time_values = ref_time_values +#' .versions = versions #' ) %>% #' ungroup() %>% #' # Focus on one geo_value so we can better see the columns above: diff --git a/vignettes/advanced.Rmd b/vignettes/advanced.Rmd index f66b0494..65f9ce05 100644 --- a/vignettes/advanced.Rmd +++ b/vignettes/advanced.Rmd @@ -106,7 +106,7 @@ edf %>% mutate(version = time_value) %>% as_epi_archive() %>% group_by(geo_value) %>% - epix_slide(x_2dav = mean(x), .before = 1, .ref_time_values = as.Date("2020-06-02")) %>% + epix_slide(x_2dav = mean(x), .before = 1, .versions = as.Date("2020-06-02")) %>% ungroup() edf %>% @@ -429,7 +429,7 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, .data$geo_value, .data$time_value, args = prob_arx_args(ahead = ahead) ), - .before = 219, .ref_time_values = fc_time_values + .before = 219, .versions = fc_time_values ) %>% mutate( target_date = .data$time_value + ahead, as_of = TRUE, diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 1f5ee1e3..07413126 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -346,7 +346,7 @@ z <- x %>% group_by(geo_value) %>% epix_slide( fc = prob_arx(x = percent_cli, y = case_rate_7d_av), .before = 119, - .ref_time_values = fc_time_values + .versions = fc_time_values ) %>% ungroup() @@ -383,7 +383,7 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { group_by(.data$geo_value) %>% epix_slide( fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, ahead = ahead), .before = 119, - .ref_time_values = fc_time_values + .versions = fc_time_values ) %>% mutate(target_date = .data$time_value + ahead, as_of = TRUE) %>% ungroup() @@ -392,7 +392,7 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { group_by(.data$geo_value) %>% epi_slide( fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, ahead = ahead), .window_size = 120, - .ref_time_values = fc_time_values + .versions = fc_time_values ) %>% mutate(target_date = .data$time_value + ahead, as_of = FALSE) %>% ungroup() From 0eba732f763ff0aa200b0c882cc6d7db8a238076 Mon Sep 17 00:00:00 2001 From: dshemetov Date: Thu, 19 Sep 2024 23:16:09 +0000 Subject: [PATCH 103/110] docs: document (GHA) --- man/epix_slide.Rd | 26 +++++++++++++------------- man/group_by.epi_archive.Rd | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index df591369..1f301846 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -78,6 +78,14 @@ in the archive is "day", and the \code{.ref_time_value} is January 8, then the smallest time_value in the snapshot will be January 1. If missing, then the default is no limit on the time values, so the full snapshot is given.} +\item{.versions}{Reference time values / versions for sliding +computations; each element of this vector serves both as the anchor point +for the \code{time_value} window for the computation and the \code{max_version} +\code{epix_as_of} which we fetch data in this window. If missing, then this will +set to a regularly-spaced sequence of values set to cover the range of +\code{version}s in the \code{DT} plus the \code{versions_end}; the spacing of values will +be guessed (using the GCD of the skips between values).} + \item{.new_col_name}{Either \code{NULL} or a string indicating the name of the new column that will contain the derived values. The default, \code{NULL}, will use the name "slide_value" unless your slide computations output data frames, @@ -94,14 +102,6 @@ requested \code{.versions}) for rows having a \code{time_value} of at least `.ve \itemize{ \item before\verb{. Otherwise, the slide computation will be passed only the most recent }version\verb{for every unique}time_value\verb{. Default is }FALSE`. }} - -\item{.ref_time_values}{Reference time values / versions for sliding -computations; each element of this vector serves both as the anchor point -for the \code{time_value} window for the computation and the \code{max_version} -\code{epix_as_of} which we fetch data in this window. If missing, then this will -set to a regularly-spaced sequence of values set to cover the range of -\code{version}s in the \code{DT} plus the \code{versions_end}; the spacing of values will -be guessed (using the GCD of the skips between values).} } \value{ A tibble whose columns are: the grouping variables, \code{time_value}, @@ -150,7 +150,7 @@ in the "advanced" vignette. computations are allowed more flexibility in their outputs than in \code{epi_slide}, we can't guess a good representation for missing computations for excluded group-\code{.ref_time_value} pairs. -\item The \code{.ref_time_values} default for \code{epix_slide} is based on making an +\item The \code{.versions} default for \code{epix_slide} is based on making an evenly-spaced sequence out of the \code{version}s in the \code{DT} plus the \code{versions_end}, rather than the \code{time_value}s. } @@ -170,7 +170,7 @@ necessary (as it its purpose). library(dplyr) # Reference time points for which we want to compute slide values: -ref_time_values <- seq(as.Date("2020-06-01"), +versions <- seq(as.Date("2020-06-01"), as.Date("2020-06-15"), by = "1 day" ) @@ -182,7 +182,7 @@ archive_cases_dv_subset \%>\% epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = ref_time_values, + .versions = versions, .new_col_name = "case_rate_7d_av_recent_av" ) \%>\% ungroup() @@ -216,7 +216,7 @@ archive_cases_dv_subset \%>\% ) }, .before = 5, .all_versions = FALSE, - .ref_time_values = ref_time_values + .versions = versions ) \%>\% ungroup() \%>\% arrange(geo_value, time_value) @@ -251,7 +251,7 @@ archive_cases_dv_subset \%>\% ) }, .before = 5, .all_versions = TRUE, - .ref_time_values = ref_time_values + .versions = versions ) \%>\% ungroup() \%>\% # Focus on one geo_value so we can better see the columns above: diff --git a/man/group_by.epi_archive.Rd b/man/group_by.epi_archive.Rd index aa6c2e2a..169bd455 100644 --- a/man/group_by.epi_archive.Rd +++ b/man/group_by.epi_archive.Rd @@ -95,7 +95,7 @@ archive_cases_dv_subset \%>\% epix_slide( .f = ~ mean(.x$case_rate_7d_av), .before = 2, - .ref_time_values = as.Date("2020-06-11") + 0:2, + .versions = as.Date("2020-06-11") + 0:2, .new_col_name = "case_rate_3d_av" ) \%>\% ungroup() From 61de9ec25c0966b74824343ef9c6b6ec57debd43 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Thu, 19 Sep 2024 16:28:09 -0700 Subject: [PATCH 104/110] fix: fix the fix --- R/grouped_epi_archive.R | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 3bcb7254..3add6fff 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -224,9 +224,7 @@ epix_slide.grouped_epi_archive <- function( # early development versions and much more likely to be clutter than # informative in the signature. provided_args <- rlang::call_args_names(rlang::call_match()) - if (any(provided_args %in% c( - "x", "f", "before", "new_col_name", "all_versions", - ))) { + if (any(provided_args %in% c("x", "f", "before", "new_col_name", "all_versions"))) { cli::cli_abort( "epix_slide: you are using one of the following old argument names: `x`, `f`, `before`, `new_col_name`, `all_versions`. Please use the new names: `.x`, `.f`, `.before`, From 25aa1b29959a12c035462dbd28b235bcd8f44b0e Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 20 Sep 2024 13:04:28 -0700 Subject: [PATCH 105/110] Also check for `slide_value` name conflict in `epix_slide` --- R/grouped_epi_archive.R | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 3add6fff..11d84e6a 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -415,15 +415,16 @@ epix_slide.grouped_epi_archive <- function( res <- c(res, comp_value[!overlaps_label_names]) } else { # Apply default name (to vector or packed data.frame-type column): + if ("slide_value" %in% names(res)) { + cli_abort(c("Cannot guess a good column name for your output", + "x" = "`slide_value` already exists in `.x`", + ">" = "Please provide a `.new_col_name`." + )) + } res[["slide_value"]] <- comp_value - # TODO check for bizarre conflicting `slide_value` label col name. - # Either here or on entry to `epix_slide` (even if there we don't know - # whether vecs will be output). Or just turn this into a special case of - # the preceding branch and let the checking code there generate a - # complaint. } } else { - # vector or packed data.frame-type column (note: overlaps with label + # Vector or packed data.frame-type column (note: overlaps with label # column names should already be forbidden by earlier validation): res[[.new_col_name]] <- comp_value } From 4f8e8d5f581ed65e739342b56d5546270f2b0623 Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 20 Sep 2024 13:24:01 -0700 Subject: [PATCH 106/110] Remove todo comment suggesting bad path --- R/utils.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index 17d59eca..1873eb1c 100644 --- a/R/utils.R +++ b/R/utils.R @@ -415,7 +415,6 @@ as_slide_computation <- function(.f, ..., .ref_time_value_long_varnames, .ref_ti # doesn't reflect this behavior). results_multiorder <- character(0L) for (quosure_i in seq_along(.f)) { - # XXX could capture and improve error messages here at cost of recover()ability quosure_result_raw <- rlang::eval_tidy(quosures[[quosure_i]], data_mask) if (is.null(quosure_result_raw)) { nm <- nms[[quosure_i]] From d2dc2bfbcc5c550b82bf6d321005fb41303aeb9c Mon Sep 17 00:00:00 2001 From: "Logan C. Brooks" Date: Fri, 20 Sep 2024 15:30:46 -0700 Subject: [PATCH 107/110] Add some epix_slide output col dedupe tests --- tests/testthat/test-epix_slide.R | 69 +++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/tests/testthat/test-epix_slide.R b/tests/testthat/test-epix_slide.R index 3589ed77..944ff0e4 100644 --- a/tests/testthat/test-epix_slide.R +++ b/tests/testthat/test-epix_slide.R @@ -772,10 +772,69 @@ test_that("`epix_slide` works with .before = Inf", { }) test_that("`epix_slide` de-dupes labeling & value columns", { - expect_identical( - xx %>% epix_slide(version = .version), - xx$DT %>% as.data.frame() %>% as_tibble() %>% distinct(version) %>% arrange(version) + # Deduping `version`: + # When comp is formula -> unpacked tibble: + forecasts1a <- xx %>% epix_slide(~ tibble( + version = .version, + geo_value = "not a group label, can be anything", + time_value = .version + c(0, 7), + value = 42 + )) + # When comp is data-masking: + forecasts1b <- xx %>% epix_slide( + version = .version, + geo_value = "not a group label, can be anything", + time_value = .version + c(0, 7), + value = 42 + ) + # Expected value: + forecasts1ref <- tibble( + version = rep(test_date + 4:7, each = 2L), + geo_value = "not a group label, can be anything", + time_value = version + c(0, 7), + value = 42 + ) + expect_equal(forecasts1a, forecasts1ref) + expect_equal(forecasts1b, forecasts1ref) + # Mismatch not accepted: + expect_error(xx %>% epix_slide( + version = .version - 1, + time_value = version + c(0, 7), + value = 42 + )) + # Solely parroting back values without any new columns seems likely to be + # nonsense (though this example would sort of act like a `distinct` + # operation if we accepted it): + expect_error(xx %>% epix_slide(~ .version, .new_col_name = "version")) + + # Deduping group label: + # When comp is formula -> unpacked tibble: + forecasts2a <- xx %>% group_by(geo_value) %>% epix_slide(~ tibble( + geo_value = .group_key$geo_value, + version = .version, + time_value = .version + c(0, 7), + value = 42 + )) + # When comp is data-masking: + forecasts2b <- xx %>% group_by(geo_value) %>% epix_slide( + geo_value = .group_key$geo_value, + version = .version, + time_value = .version + c(0, 7), + value = 42 ) - expect_error(xx %>% epix_slide(version = .version + 1)) - # FIXME more tests + # Expected value: + forecasts2ref <- tibble( + geo_value = "ak", + version = rep(test_date + 4:7, each = 2L), + time_value = version + c(0, 7), + value = 42 + ) %>% group_by(geo_value) + expect_equal(forecasts2a, forecasts2ref) + expect_equal(forecasts2b, forecasts2ref) + # Mismatch not accepted: + expect_error(xx %>% group_by(geo_value) %>% epix_slide(geo_value = "bogus")) + # Solely parroting back values without any new columns seems likely to be + # nonsense (though this example would sort of act like a `distinct` + # operation if we accepted it): + expect_error(xx %>% group_by(geo_value) %>% epix_slide(~ .group_key$geo_value, .new_col_name = "geo_value")) }) From dd19428ab3d05a43a5697cc899eb7929fe762774 Mon Sep 17 00:00:00 2001 From: brookslogan Date: Fri, 20 Sep 2024 22:32:50 +0000 Subject: [PATCH 108/110] style: styler (GHA) --- tests/testthat/test-epix_slide.R | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/tests/testthat/test-epix_slide.R b/tests/testthat/test-epix_slide.R index 944ff0e4..c0d752dc 100644 --- a/tests/testthat/test-epix_slide.R +++ b/tests/testthat/test-epix_slide.R @@ -805,23 +805,27 @@ test_that("`epix_slide` de-dupes labeling & value columns", { # Solely parroting back values without any new columns seems likely to be # nonsense (though this example would sort of act like a `distinct` # operation if we accepted it): - expect_error(xx %>% epix_slide(~ .version, .new_col_name = "version")) + expect_error(xx %>% epix_slide(~.version, .new_col_name = "version")) # Deduping group label: # When comp is formula -> unpacked tibble: - forecasts2a <- xx %>% group_by(geo_value) %>% epix_slide(~ tibble( - geo_value = .group_key$geo_value, - version = .version, - time_value = .version + c(0, 7), - value = 42 - )) + forecasts2a <- xx %>% + group_by(geo_value) %>% + epix_slide(~ tibble( + geo_value = .group_key$geo_value, + version = .version, + time_value = .version + c(0, 7), + value = 42 + )) # When comp is data-masking: - forecasts2b <- xx %>% group_by(geo_value) %>% epix_slide( - geo_value = .group_key$geo_value, - version = .version, - time_value = .version + c(0, 7), - value = 42 - ) + forecasts2b <- xx %>% + group_by(geo_value) %>% + epix_slide( + geo_value = .group_key$geo_value, + version = .version, + time_value = .version + c(0, 7), + value = 42 + ) # Expected value: forecasts2ref <- tibble( geo_value = "ak", From 8202c0e2521556868d87baff3a891349958297f0 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 20 Sep 2024 11:38:24 -0700 Subject: [PATCH 109/110] refactor+doc: key_colnames and vignettes * key_colnames order change * replace kill_time_value with exclude arg in key_colnames * move duplicate time_values check in epi_slide --- .Rbuildignore | 2 + .gitignore | 1 + DESCRIPTION | 3 +- NAMESPACE | 2 - R/autoplot.R | 2 +- R/epi_df.R | 11 +- R/grouped_epi_archive.R | 4 +- R/key_colnames.R | 33 +- R/methods-epi_archive.R | 4 +- R/methods-epi_df.R | 29 +- R/outliers.R | 12 +- R/revision_analysis.R | 10 +- R/slide.R | 43 ++- R/utils.R | 31 +- _pkgdown.yml | 1 - man-roxygen/basic-slide-details.R | 6 +- man/as_slide_computation.Rd | 113 ++++++ man/detect_outlr_rm.Rd | 3 +- man/detect_outlr_stl.Rd | 5 +- man/epi_slide.Rd | 6 +- man/epix_slide.Rd | 4 +- man/group_epi_df.Rd | 19 + man/key_colnames.Rd | 18 +- man/sum_groups_epi_df.Rd | 4 +- tests/testthat/test-arrange-canonical.R | 15 +- tests/testthat/test-epi_slide.R | 10 +- tests/testthat/test-methods-epi_df.R | 11 +- tests/testthat/test-utils.R | 18 + vignettes/advanced.Rmd | 488 ------------------------ vignettes/aggregation.Rmd | 25 +- vignettes/archive.Rmd | 332 +++++++++++++--- vignettes/epiprocess.Rmd | 14 +- vignettes/growth_rate.Rmd | 2 +- vignettes/outliers.Rmd | 16 +- vignettes/slide.Rmd | 246 ++++++------ 35 files changed, 748 insertions(+), 795 deletions(-) create mode 100644 man/as_slide_computation.Rd create mode 100644 man/group_epi_df.Rd delete mode 100644 vignettes/advanced.Rmd diff --git a/.Rbuildignore b/.Rbuildignore index 0582014a..cb0b7ed2 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -16,3 +16,5 @@ ^.lintr$ ^DEVELOPMENT.md$ man-roxygen +^.venv$ +^sandbox.R$ \ No newline at end of file diff --git a/.gitignore b/.gitignore index de393a31..8dc001be 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ docs renv/ renv.lock .Rprofile +sandbox.R \ No newline at end of file diff --git a/DESCRIPTION b/DESCRIPTION index 333bf13c..790b36a5 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -50,7 +50,8 @@ Imports: tidyselect (>= 1.2.0), tsibble, utils, - vctrs + vctrs, + waldo Suggests: covidcast, devtools, diff --git a/NAMESPACE b/NAMESPACE index 03364f16..904b2d24 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -55,10 +55,8 @@ export("%>%") export(archive_cases_dv_subset) export(arrange) export(arrange_canonical) -export(as_diagonal_slide_computation) export(as_epi_archive) export(as_epi_df) -export(as_time_slide_computation) export(as_tsibble) export(autoplot) export(clone) diff --git a/R/autoplot.R b/R/autoplot.R index 23f480fe..eef5aa12 100644 --- a/R/autoplot.R +++ b/R/autoplot.R @@ -55,7 +55,7 @@ autoplot.epi_df <- function( key_cols <- key_colnames(object) non_key_cols <- setdiff(names(object), key_cols) - geo_and_other_keys <- kill_time_value(key_cols) + geo_and_other_keys <- key_colnames(object, exclude = "time_value") # --- check for numeric variables allowed <- purrr::map_lgl(object[non_key_cols], is.numeric) diff --git a/R/epi_df.R b/R/epi_df.R index 420ce2dc..c8d052d9 100644 --- a/R/epi_df.R +++ b/R/epi_df.R @@ -184,18 +184,14 @@ new_epi_df <- function(x = tibble::tibble(geo_value = character(), time_value = metadata$other_keys <- other_keys # Reorder columns (geo_value, time_value, ...) - if (sum(dim(x)) != 0) { - cols_to_put_first <- c("geo_value", "time_value", other_keys) - x <- x[, c( - cols_to_put_first, - # All other columns - names(x)[!(names(x) %in% cols_to_put_first)] - )] + if (nrow(x) > 0) { + x <- x %>% relocate(all_of(c("geo_value", other_keys, "time_value")), .before = 1) } # Apply epi_df class, attach metadata, and return class(x) <- c("epi_df", class(x)) attributes(x)$metadata <- metadata + return(x) } @@ -281,6 +277,7 @@ as_epi_df.tbl_df <- function( if (".time_value_counts" %in% other_keys) { cli_abort("as_epi_df: `other_keys` can't include \".time_value_counts\"") } + duplicated_time_values <- x %>% group_by(across(all_of(c("geo_value", "time_value", other_keys)))) %>% filter(dplyr::n() > 1) %>% diff --git a/R/grouped_epi_archive.R b/R/grouped_epi_archive.R index 11d84e6a..b592cd91 100644 --- a/R/grouped_epi_archive.R +++ b/R/grouped_epi_archive.R @@ -397,8 +397,8 @@ epix_slide.grouped_epi_archive <- function( )), capture.output(print(waldo::compare( res[[comp_nms[[comp_i]]]], comp_value[[comp_i]], - x_arg = rlang::expr_deparse(expr(`$`(label, !!sym(comp_nms[[comp_i]])))), - y_arg = rlang::expr_deparse(expr(`$`(comp_value, !!sym(comp_nms[[comp_i]])))) + x_arg = rlang::expr_deparse(dplyr::expr(`$`(label, !!sym(comp_nms[[comp_i]])))), # nolint: object_usage_linter + y_arg = rlang::expr_deparse(dplyr::expr(`$`(comp_value, !!sym(comp_nms[[comp_i]])))) ))), cli::format_message(c( "You likely want to rename or remove this column in your output, or debug why it has a different value." diff --git a/R/key_colnames.R b/R/key_colnames.R index b0119764..49c32674 100644 --- a/R/key_colnames.R +++ b/R/key_colnames.R @@ -2,39 +2,46 @@ #' #' @param x a data.frame, tibble, or epi_df #' @param ... additional arguments passed on to methods -#' -#' @return If an `epi_df`, this returns all "keys". Otherwise `NULL` +#' @param other_keys an optional character vector of other keys to include +#' @param exclude an optional character vector of keys to exclude +#' @return If an `epi_df`, this returns all "keys". Otherwise `NULL`. #' @keywords internal #' @export key_colnames <- function(x, ...) { UseMethod("key_colnames") } +#' @rdname key_colnames +#' @method key_colnames default #' @export key_colnames.default <- function(x, ...) { character(0L) } +#' @rdname key_colnames +#' @method key_colnames data.frame #' @export -key_colnames.data.frame <- function(x, other_keys = character(0L), ...) { +key_colnames.data.frame <- function(x, other_keys = character(0L), exclude = character(0L), ...) { assert_character(other_keys) - nm <- c("geo_value", "time_value", other_keys) + assert_character(exclude) + nm <- setdiff(c("geo_value", other_keys, "time_value"), exclude) intersect(nm, colnames(x)) } +#' @rdname key_colnames +#' @method key_colnames epi_df #' @export -key_colnames.epi_df <- function(x, ...) { +key_colnames.epi_df <- function(x, exclude = character(0L), ...) { + assert_character(exclude) other_keys <- attr(x, "metadata")$other_keys - c("geo_value", "time_value", other_keys) + setdiff(c("geo_value", other_keys, "time_value"), exclude) } +#' @rdname key_colnames +#' @method key_colnames epi_archive #' @export -key_colnames.epi_archive <- function(x, ...) { +key_colnames.epi_archive <- function(x, exclude = character(0L), ...) { + assert_character(exclude) other_keys <- attr(x, "metadata")$other_keys - c("geo_value", "time_value", other_keys) -} - -kill_time_value <- function(v) { - assert_character(v) - v[v != "time_value"] + setdiff(c("geo_value", other_keys, "time_value"), exclude) } diff --git a/R/methods-epi_archive.R b/R/methods-epi_archive.R index be34211b..0304d9a6 100644 --- a/R/methods-epi_archive.R +++ b/R/methods-epi_archive.R @@ -731,7 +731,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' library(dplyr) #' #' # Reference time points for which we want to compute slide values: -#' versions <- seq(as.Date("2020-06-01"), +#' versions <- seq(as.Date("2020-06-02"), #' as.Date("2020-06-15"), #' by = "1 day" #' ) @@ -780,7 +780,7 @@ epix_detailed_restricted_mutate <- function(.data, ...) { #' .versions = versions #' ) %>% #' ungroup() %>% -#' arrange(geo_value, time_value) +#' arrange(geo_value, version) #' #' # --- Advanced: --- #' diff --git a/R/methods-epi_df.R b/R/methods-epi_df.R index c859f249..901b9b32 100644 --- a/R/methods-epi_df.R +++ b/R/methods-epi_df.R @@ -41,10 +41,13 @@ as_tibble.epi_df <- function(x, ...) { #' @export as_tsibble.epi_df <- function(x, key, ...) { if (missing(key)) key <- c("geo_value", attributes(x)$metadata$other_keys) - return(as_tsibble(tibble::as_tibble(x), - key = tidyselect::all_of(key), index = "time_value", - ... - )) + return( + as_tsibble( + tibble::as_tibble(x), + key = tidyselect::all_of(key), index = "time_value", + ... + ) + ) } #' Base S3 methods for an `epi_df` object @@ -150,10 +153,10 @@ dplyr_reconstruct.epi_df <- function(data, template) { # keep any grouping that has been applied: res <- NextMethod() - cn <- names(res) + col_names <- names(res) # Duplicate columns, cli_abort - dup_col_names <- cn[duplicated(cn)] + dup_col_names <- col_names[duplicated(col_names)] if (length(dup_col_names) != 0) { cli_abort(c( "Duplicate column names are not allowed", @@ -163,7 +166,7 @@ dplyr_reconstruct.epi_df <- function(data, template) { )) } - not_epi_df <- !("time_value" %in% cn) || !("geo_value" %in% cn) + not_epi_df <- !("time_value" %in% col_names) || !("geo_value" %in% col_names) if (not_epi_df) { # If we're calling on an `epi_df` from one of our own functions, we need to @@ -182,7 +185,7 @@ dplyr_reconstruct.epi_df <- function(data, template) { # Amend additional metadata if some other_keys cols are dropped in the subset old_other_keys <- attr(template, "metadata")$other_keys - attr(res, "metadata")$other_keys <- old_other_keys[old_other_keys %in% cn] + attr(res, "metadata")$other_keys <- old_other_keys[old_other_keys %in% col_names] res } @@ -424,9 +427,13 @@ arrange_col_canonical.epi_df <- function(x, ...) { x %>% dplyr::relocate(dplyr::all_of(cols), .before = 1) } +#' Group an `epi_df` object by default keys +#' @param x an `epi_df` +#' @param exclude character vector of column names to exclude from grouping +#' @return a grouped `epi_df` #' @export -group_epi_df <- function(x) { - cols <- kill_time_value(key_colnames(x)) +group_epi_df <- function(x, exclude = character()) { + cols <- key_colnames(x, exclude = exclude) x %>% group_by(across(all_of(cols))) } @@ -437,7 +444,7 @@ group_epi_df <- function(x) { #' the resulting `epi_df` will have `geo_value` set to `"total"`. #' #' @param .x an `epi_df` -#' @param value_col character vector of the columns to aggregate +#' @param sum_cols character vector of the columns to aggregate #' @param group_cols character vector of column names to group by. "time_value" is #' included by default. #' @return an `epi_df` object diff --git a/R/outliers.R b/R/outliers.R index 8be492dd..c2187de0 100644 --- a/R/outliers.R +++ b/R/outliers.R @@ -161,8 +161,7 @@ detect_outlr <- function(x = seq_along(y), y, #' group_by(geo_value) %>% #' mutate(outlier_info = detect_outlr_rm( #' x = time_value, y = cases -#' )) %>% -#' unnest(outlier_info) +#' )) detect_outlr_rm <- function(x = seq_along(y), y, n = 21, log_transform = FALSE, detect_negatives = FALSE, @@ -189,7 +188,7 @@ detect_outlr_rm <- function(x = seq_along(y), y, n = 21, # Calculate lower and upper thresholds and replacement value z <- z %>% - epi_slide(fitted = median(y), .window_size = n, .align = "center") %>% + epi_slide(fitted = median(y, na.rm = TRUE), .window_size = n, .align = "center") %>% dplyr::mutate(resid = y - fitted) %>% roll_iqr( n = n, @@ -256,9 +255,8 @@ detect_outlr_rm <- function(x = seq_along(y), y, n = 21, #' group_by(geo_value) %>% #' mutate(outlier_info = detect_outlr_stl( #' x = time_value, y = cases, -#' seasonal_period = 7 -#' )) %>% # weekly seasonality for daily data -#' unnest(outlier_info) +#' seasonal_period = 7 # weekly seasonality for daily data +#' )) detect_outlr_stl <- function(x = seq_along(y), y, n_trend = 21, n_seasonal = 21, @@ -359,7 +357,7 @@ roll_iqr <- function(z, n, detection_multiplier, min_radius, z %>% epi_slide( - roll_iqr = stats::IQR(resid), + roll_iqr = stats::IQR(resid, na.rm = TRUE), .window_size = n, .align = "center" ) %>% dplyr::mutate( diff --git a/R/revision_analysis.R b/R/revision_analysis.R index be83d68c..7be0cd24 100644 --- a/R/revision_analysis.R +++ b/R/revision_analysis.R @@ -81,8 +81,8 @@ revision_summary <- function(epi_arch, should_compactify = TRUE) { arg <- names(eval_select(rlang::expr(c(...)), allow_rename = FALSE, data = epi_arch$DT)) if (length(arg) == 0) { - first_non_key <- !(names(epi_arch$DT) %in% c(key_colnames(epi_arch), "version")) - arg <- names(epi_arch$DT)[first_non_key][1] + # Choose the first column that's not a key or version + arg <- setdiff(names(epi_arch$DT), c(key_colnames(epi_arch), "version"))[[1]] } else if (length(arg) > 1) { cli_abort("Not currently implementing more than one column at a time. Run each separately") } @@ -99,11 +99,9 @@ revision_summary <- function(epi_arch, # # revision_tibble keys <- key_colnames(epi_arch) - names(epi_arch$DT) - revision_behavior <- - epi_arch$DT %>% - select(c(geo_value, time_value, all_of(keys), version, !!arg)) + revision_behavior <- epi_arch$DT %>% + select(all_of(unique(c("geo_value", "time_value", keys, "version", arg)))) if (!is.null(min_waiting_period)) { revision_behavior <- revision_behavior %>% filter(abs(time_value - as.Date(epi_arch$versions_end)) >= min_waiting_period) diff --git a/R/slide.R b/R/slide.R index 192597da..5a7fbd6a 100644 --- a/R/slide.R +++ b/R/slide.R @@ -122,8 +122,7 @@ epi_slide <- function( assert_class(.x, "epi_df") if (checkmate::test_class(.x, "grouped_df")) { expected_group_keys <- .x %>% - key_colnames() %>% - kill_time_value() %>% + key_colnames(exclude = "time_value") %>% sort() if (!identical(.x %>% group_vars() %>% sort(), expected_group_keys)) { cli_abort( @@ -134,12 +133,11 @@ epi_slide <- function( ) } } else { - .x <- group_epi_df(.x) + .x <- group_epi_df(.x, exclude = "time_value") } if (nrow(.x) == 0L) { return(.x) } - # If `.f` is missing, interpret ... as an expression for tidy evaluation if (missing(.f)) { used_data_masking <- TRUE @@ -191,6 +189,20 @@ epi_slide <- function( assert_logical(.all_rows, len = 1) + # Check for duplicated time values within groups + duplicated_time_values <- .x %>% + group_epi_df() %>% + filter(dplyr::n() > 1) %>% + ungroup() + if (nrow(duplicated_time_values) > 0) { + bad_data <- capture.output(duplicated_time_values) + cli_abort( + "as_epi_df: some groups in a resulting dplyr computation have duplicated time values. + epi_df requires a unique time_value per group.", + body = c("Sample groups:", bad_data) + ) + } + # Begin handling completion. This will create a complete time index between # the smallest and largest time values in the data. This is used to ensure # that the slide function is called with a complete window of data. Each slide @@ -241,7 +253,7 @@ epi_slide <- function( .keep = TRUE ) %>% bind_rows() %>% - filter(.data$.real) %>% + filter(.real) %>% select(-.real) %>% arrange_col_canonical() %>% group_by(!!!.x_groups) @@ -275,11 +287,16 @@ epi_slide_one_group <- function( missing_times <- all_dates[!(all_dates %in% .data_group$time_value)] .data_group <- bind_rows( .data_group, - tibble(time_value = c( - missing_times, - .date_seq_list$pad_early_dates, - .date_seq_list$pad_late_dates - ), .real = FALSE) + dplyr::bind_cols( + .group_key, + tibble( + time_value = c( + missing_times, + .date_seq_list$pad_early_dates, + .date_seq_list$pad_late_dates + ), .real = FALSE + ) + ) ) %>% arrange(.data$time_value) @@ -405,8 +422,8 @@ epi_slide_one_group <- function( )), capture.output(print(waldo::compare( res[[comp_nms[[comp_i]]]], slide_values[[comp_i]], - x_arg = rlang::expr_deparse(expr(`$`(existing, !!sym(comp_nms[[comp_i]])))), - y_arg = rlang::expr_deparse(expr(`$`(comp_value, !!sym(comp_nms[[comp_i]])))) + x_arg = rlang::expr_deparse(dplyr::expr(`$`(existing, !!sym(comp_nms[[comp_i]])))), # nolint: object_usage_linter + y_arg = rlang::expr_deparse(dplyr::expr(`$`(comp_value, !!sym(comp_nms[[comp_i]])))) # nolint: object_usage_linter ))), cli::format_message(c( ">" = "You likely want to rename or remove this column from your slide @@ -711,7 +728,7 @@ epi_slide_opt <- function( # positions of user-provided `col_names` into string column names. We avoid # using `names(pos)` directly for robustness and in case we later want to # allow users to rename fields via tidyselection. - if (class(quo_get_expr(enquo(.col_names))) == "character") { + if (inherits(quo_get_expr(enquo(.col_names)), "character")) { pos <- eval_select(dplyr::all_of(.col_names), data = .x, allow_rename = FALSE) } else { pos <- eval_select(enquo(.col_names), data = .x, allow_rename = FALSE) diff --git a/R/utils.R b/R/utils.R index 1873eb1c..bb30264a 100644 --- a/R/utils.R +++ b/R/utils.R @@ -355,32 +355,9 @@ assert_sufficient_f_args <- function(.f, ..., .ref_time_value_label) { #' #' @template ref-time-value-label #' -#' @examples -#' f1 <- as_slide_computation(~ .z - .x$time_value, -#' .ref_time_value_long_varnames = character(0L), -#' .ref_time_value_label = "third argument" -#' ) -#' f1(tibble::tibble(time_value = 10), tibble::tibble(), 12) -#' -#' f2 <- as_time_slide_computation(~ .ref_time_value - .x$time_value) -#' f2(tibble::tibble(time_value = 10), tibble::tibble(), 12) -#' -#' f3 <- as_diagonal_slide_computation(~ .version - .x$time_value) -#' f3(tibble::tibble(time_value = 10), tibble::tibble(), 12) -#' -#' f4 <- as_diagonal_slide_computation(~ .ref_time_value - .x$time_value) -#' f4(tibble::tibble(time_value = 10), tibble::tibble(), 12) -#' -#' g <- as_time_slide_computation(~ -1 * .) -#' g(4) -#' -#' h <- as_time_slide_computation(~ .x - .group_key) -#' h(6, 3) -#' #' @importFrom rlang is_function new_function f_env is_environment missing_arg #' f_rhs is_formula caller_arg caller_env -#' -#' @noRd +#' @keywords internal as_slide_computation <- function(.f, ..., .ref_time_value_long_varnames, .ref_time_value_label) { arg <- caller_arg(.f) call <- caller_env() @@ -542,8 +519,7 @@ as_slide_computation <- function(.f, ..., .ref_time_value_long_varnames, .ref_ti } #' @rdname as_slide_computation -#' @export -#' @noRd +#' @keywords internal as_time_slide_computation <- function(.f, ...) { as_slide_computation( .f, ..., @@ -553,8 +529,7 @@ as_time_slide_computation <- function(.f, ...) { } #' @rdname as_slide_computation -#' @export -#' @noRd +#' @keywords internal as_diagonal_slide_computation <- function(.f, ...) { as_slide_computation( .f, ..., diff --git a/_pkgdown.yml b/_pkgdown.yml index 62f006fe..1bc7f795 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -48,7 +48,6 @@ articles: - aggregation - outliers - archive - - advanced - compactify repo: diff --git a/man-roxygen/basic-slide-details.R b/man-roxygen/basic-slide-details.R index 64570976..df87f882 100644 --- a/man-roxygen/basic-slide-details.R +++ b/man-roxygen/basic-slide-details.R @@ -9,7 +9,7 @@ #' boundary of the dataset) and will attempt to perform the computation #' anyway. The issue of what to do with partial computations (those run on #' incomplete windows) is therefore left up to the user, either through the -#' specified function or formula `f`, or through post-processing. +#' specified function or formula, or through post-processing. #' #' Let's look at some window examples, assuming that the reference time value #' is "tv". With .align = "right" and .window_size = 3, the window will be: @@ -60,8 +60,8 @@ #' "pronoun"-like bindings available: #' * .x, which is like `.x` in [`dplyr::group_modify`]; an ordinary object #' like an `epi_df` rather than an rlang [pronoun][rlang::as_data_pronoun] -#' like [`.data`]; this allows you to use additional {dplyr}, {tidyr}, and -#' {epiprocess} operations. If you have multiple expressions in `...`, this +#' like [`.data`]; this allows you to use additional `dplyr`, `tidyr`, and +#' `epiprocess` operations. If you have multiple expressions in `...`, this #' won't let you refer to the output of the earlier expressions, but `.data` #' will. #' * .group_key, which is like `.y` in [`dplyr::group_modify`]. diff --git a/man/as_slide_computation.Rd b/man/as_slide_computation.Rd new file mode 100644 index 00000000..3db5a940 --- /dev/null +++ b/man/as_slide_computation.Rd @@ -0,0 +1,113 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{as_slide_computation} +\alias{as_slide_computation} +\alias{as_time_slide_computation} +\alias{as_diagonal_slide_computation} +\title{Generate a \verb{epi[x]_slide} computation function from a function, formula, or quosure} +\source{ +This code and documentation are based on +\href{https://github.com/r-lib/rlang/blob/c55f6027928d3104ed449e591e8a225fcaf55e13/R/fn.R#L343-L427}{\code{as_function}} +from Hadley Wickham's \code{rlang} package. + +Below is the original license for the \code{rlang} package. + +MIT License + +Copyright (c) 2020 rlang authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Portions of the original code used in this adaptation: +\enumerate{ +\item Much of the documentation and examples +\item The general flow of the function, including branching conditions +\item Error conditions and wording +\item The chunk converting a formula into a function, see +https://github.com/r-lib/rlang/blob/c55f6027928d3104ed449e591e8a225fcaf55e13/R/fn.R#L411-L418 +} + +Changes made include: +\enumerate{ +\item Updates to documentation due to new functionality +\item The removal of function-as-string processing logic and helper arg +\code{env} +\item The addition of an output function wrapper that defines a data mask +for evaluating quosures +\item Calling an argument-checking function +\item Replacing rlang error functions with internal error functions +} +} +\usage{ +as_slide_computation( + .f, + ..., + .ref_time_value_long_varnames, + .ref_time_value_label +) + +as_time_slide_computation(.f, ...) + +as_diagonal_slide_computation(.f, ...) +} +\arguments{ +\item{...}{Additional arguments to pass to the function or formula +specified via \code{x}. If \code{x} is a quosure, any arguments passed via \code{...} +will be ignored.} + +\item{.ref_time_value_long_varnames}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} +Character vector. What variable names should we allow formulas and +data-masking tidy evaluation to use to refer to \code{ref_time_value} for the +computation (in addition to \code{.z} in formulas)? E.g., \code{".ref_time_value"} or +\code{c(".ref_time_value", ".version")}.} + +\item{.ref_time_value_label}{String; how to describe/label the \code{ref_time_value} in +error messages; e.g., "reference time value" or "version".} + +\item{f}{A function, one-sided formula, or quosure. + +If a \strong{function}, the function is returned as-is, with no +modifications. + +If a \strong{formula}, e.g. \code{~ mean(.x$cases)}, it is converted to a function +with up to three arguments: \code{.x} (single argument), or \code{.x} and \code{.y} +(two arguments), or \code{.x}, \code{.y}, and \code{.z} (three arguments). The \code{.} +placeholder can be used instead of \code{.x}, \code{.group_key} can be used in +place of \code{.y}, and \code{.ref_time_value} can be used in place of \code{.z}. This +allows you to create very compact anonymous functions (lambdas) with up +to three inputs. Functions created from formulas have a special class. +Use \code{inherits(fn, "epiprocess_slide_computation")} to test for it. + +If a \strong{quosure}, in the case that \code{f} was not provided to the parent +\verb{epi[x]_slide} call and the \code{...} is interpreted as an expression for +tidy evaluation, it is evaluated within a wrapper function. The wrapper +sets up object access via a data mask.} +} +\description{ +\code{as_slide_computation()} transforms a one-sided formula or a +quosure into a function; functions are returned as-is or with light +modifications to calculate \code{ref_time_value}. + +This code extends \code{rlang::as_function} to create functions that take three +arguments. The arguments can be accessed via the idiomatic \code{.}, \code{.x}, and +\code{.y}, extended to include \code{.z}; positional references \code{..1} and \code{..2}, +extended to include \code{..3}; and also by \verb{epi[x]_slide}-specific names +\code{.group_key} and \code{.ref_time_value}. +} +\keyword{internal} diff --git a/man/detect_outlr_rm.Rd b/man/detect_outlr_rm.Rd index 333c4a7b..b57c4445 100644 --- a/man/detect_outlr_rm.Rd +++ b/man/detect_outlr_rm.Rd @@ -65,6 +65,5 @@ incidence_num_outlier_example \%>\% group_by(geo_value) \%>\% mutate(outlier_info = detect_outlr_rm( x = time_value, y = cases - )) \%>\% - unnest(outlier_info) + )) } diff --git a/man/detect_outlr_stl.Rd b/man/detect_outlr_stl.Rd index 695c2de7..fb69e8da 100644 --- a/man/detect_outlr_stl.Rd +++ b/man/detect_outlr_stl.Rd @@ -96,7 +96,6 @@ incidence_num_outlier_example \%>\% group_by(geo_value) \%>\% mutate(outlier_info = detect_outlr_stl( x = time_value, y = cases, - seasonal_period = 7 - )) \%>\% # weekly seasonality for daily data - unnest(outlier_info) + seasonal_period = 7 # weekly seasonality for daily data + )) } diff --git a/man/epi_slide.Rd b/man/epi_slide.Rd index 323fdf4d..74929eb1 100644 --- a/man/epi_slide.Rd +++ b/man/epi_slide.Rd @@ -109,7 +109,7 @@ keep NAs around. boundary of the dataset) and will attempt to perform the computation anyway. The issue of what to do with partial computations (those run on incomplete windows) is therefore left up to the user, either through the -specified function or formula \code{f}, or through post-processing. +specified function or formula, or through post-processing. Let's look at some window examples, assuming that the reference time value is "tv". With .align = "right" and .window_size = 3, the window will be: @@ -165,8 +165,8 @@ In addition to \code{\link{.data}} and \code{\link{.env}}, we make some addition \itemize{ \item .x, which is like \code{.x} in \code{\link[dplyr:group_map]{dplyr::group_modify}}; an ordinary object like an \code{epi_df} rather than an rlang \link[rlang:as_data_mask]{pronoun} -like \code{\link{.data}}; this allows you to use additional {dplyr}, {tidyr}, and -{epiprocess} operations. If you have multiple expressions in \code{...}, this +like \code{\link{.data}}; this allows you to use additional \code{dplyr}, \code{tidyr}, and +\code{epiprocess} operations. If you have multiple expressions in \code{...}, this won't let you refer to the output of the earlier expressions, but \code{.data} will. \item .group_key, which is like \code{.y} in \code{\link[dplyr:group_map]{dplyr::group_modify}}. diff --git a/man/epix_slide.Rd b/man/epix_slide.Rd index 1f301846..1326cc18 100644 --- a/man/epix_slide.Rd +++ b/man/epix_slide.Rd @@ -170,7 +170,7 @@ necessary (as it its purpose). library(dplyr) # Reference time points for which we want to compute slide values: -versions <- seq(as.Date("2020-06-01"), +versions <- seq(as.Date("2020-06-02"), as.Date("2020-06-15"), by = "1 day" ) @@ -219,7 +219,7 @@ archive_cases_dv_subset \%>\% .versions = versions ) \%>\% ungroup() \%>\% - arrange(geo_value, time_value) + arrange(geo_value, version) # --- Advanced: --- diff --git a/man/group_epi_df.Rd b/man/group_epi_df.Rd new file mode 100644 index 00000000..5895a52f --- /dev/null +++ b/man/group_epi_df.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods-epi_df.R +\name{group_epi_df} +\alias{group_epi_df} +\title{Group an \code{epi_df} object by default keys} +\usage{ +group_epi_df(x, exclude = character()) +} +\arguments{ +\item{x}{an \code{epi_df}} + +\item{exclude}{character vector of column names to exclude from grouping} +} +\value{ +a grouped \code{epi_df} +} +\description{ +Group an \code{epi_df} object by default keys +} diff --git a/man/key_colnames.Rd b/man/key_colnames.Rd index fbaa3c11..f5e13837 100644 --- a/man/key_colnames.Rd +++ b/man/key_colnames.Rd @@ -2,17 +2,33 @@ % Please edit documentation in R/key_colnames.R \name{key_colnames} \alias{key_colnames} +\alias{key_colnames.default} +\alias{key_colnames.data.frame} +\alias{key_colnames.epi_df} +\alias{key_colnames.epi_archive} \title{Grab any keys associated to an epi_df} \usage{ key_colnames(x, ...) + +\method{key_colnames}{default}(x, ...) + +\method{key_colnames}{data.frame}(x, other_keys = character(0L), exclude = character(0L), ...) + +\method{key_colnames}{epi_df}(x, exclude = character(0L), ...) + +\method{key_colnames}{epi_archive}(x, exclude = character(0L), ...) } \arguments{ \item{x}{a data.frame, tibble, or epi_df} \item{...}{additional arguments passed on to methods} + +\item{other_keys}{an optional character vector of other keys to include} + +\item{exclude}{an optional character vector of keys to exclude} } \value{ -If an \code{epi_df}, this returns all "keys". Otherwise \code{NULL} +If an \code{epi_df}, this returns all "keys". Otherwise \code{NULL}. } \description{ Grab any keys associated to an epi_df diff --git a/man/sum_groups_epi_df.Rd b/man/sum_groups_epi_df.Rd index 8b4c13ba..f1ba8474 100644 --- a/man/sum_groups_epi_df.Rd +++ b/man/sum_groups_epi_df.Rd @@ -9,10 +9,10 @@ sum_groups_epi_df(.x, sum_cols = "value", group_cols = character()) \arguments{ \item{.x}{an \code{epi_df}} +\item{sum_cols}{character vector of the columns to aggregate} + \item{group_cols}{character vector of column names to group by. "time_value" is included by default.} - -\item{value_col}{character vector of the columns to aggregate} } \value{ an \code{epi_df} object diff --git a/tests/testthat/test-arrange-canonical.R b/tests/testthat/test-arrange-canonical.R index 939d2f32..24d3f5f9 100644 --- a/tests/testthat/test-arrange-canonical.R +++ b/tests/testthat/test-arrange-canonical.R @@ -8,14 +8,13 @@ test_that("canonical arrangement works", { expect_error(arrange_canonical(tib)) tib <- tib %>% as_epi_df(other_keys = "demo_grp") - expect_equal(names(tib), c("geo_value", "time_value", "demo_grp", "x")) + expect_equal(names(tib), c("geo_value", "demo_grp", "time_value", "x")) - tib_cols_shuffled <- tib %>% select(geo_value, time_value, x, demo_grp) - - tib_sorted <- arrange_canonical(tib_cols_shuffled) - expect_equal(names(tib_sorted), c("geo_value", "time_value", "demo_grp", "x")) + tib_sorted <- tib %>% + arrange_canonical() + expect_equal(names(tib_sorted), c("geo_value", "demo_grp", "time_value", "x")) expect_equal(tib_sorted$geo_value, rep(c("ca", "ga"), each = 4)) - expect_equal(tib_sorted$time_value, c(1, 1, 2, 2, 1, 1, 2, 2)) - expect_equal(tib_sorted$demo_grp, rep(letters[1:2], times = 4)) - expect_equal(tib_sorted$x, c(8, 6, 7, 5, 4, 2, 3, 1)) + expect_equal(tib_sorted$time_value, c(1, 2, 1, 2, 1, 2, 1, 2)) + expect_equal(tib_sorted$demo_grp, c("a", "a", "b", "b", "a", "a", "b", "b")) + expect_equal(tib_sorted$x, c(8, 7, 6, 5, 4, 3, 2, 1)) }) diff --git a/tests/testthat/test-epi_slide.R b/tests/testthat/test-epi_slide.R index e8416693..d644e9a7 100644 --- a/tests/testthat/test-epi_slide.R +++ b/tests/testthat/test-epi_slide.R @@ -53,7 +53,7 @@ get_test_dataset <- function(n, time_type = "day", other_keys = FALSE) { } df %>% arrange_canonical() %>% - group_epi_df() + group_epi_df(exclude = "time_value") } test_data <- get_test_dataset(num_rows_per_group, "day") @@ -82,10 +82,10 @@ epi_slide_sum_test <- function( .x %>% mutate(.real = TRUE) %>% - group_epi_df() %>% + group_epi_df(exclude = "time_value") %>% complete(time_value = vctrs::vec_c(!!!date_seq_list, .name_spec = rlang::zap())) %>% arrange_canonical() %>% - group_epi_df() %>% + group_epi_df(exclude = "time_value") %>% mutate( slide_value = slider::slide_index_sum( .data$value, @@ -246,7 +246,7 @@ for (p in (param_combinations %>% transpose())) { mutate(slide_value = list(slide_value)) %>% ungroup() %>% as_epi_df(as_of = attr(test_data, "metadata")$as_of, other_keys = attr(test_data, "metadata")$other_keys) %>% - group_epi_df() + group_epi_df(exclude = "time_value") expect_equal( out %>% select(-slide_value), @@ -268,7 +268,7 @@ for (p in (param_combinations %>% transpose())) { mutate(slide_value = list(slide_value)) %>% ungroup() %>% as_epi_df(as_of = attr(test_data, "metadata")$as_of, other_keys = attr(test_data, "metadata")$other_keys) %>% - group_epi_df() + group_epi_df(exclude = "time_value") expect_equal( out %>% select(-slide_value), expected_out %>% select(-slide_value) diff --git a/tests/testthat/test-methods-epi_df.R b/tests/testthat/test-methods-epi_df.R index f1bca059..3e5c180b 100644 --- a/tests/testthat/test-methods-epi_df.R +++ b/tests/testthat/test-methods-epi_df.R @@ -69,21 +69,20 @@ test_that("Subsetting drops & does not drop the epi_df class appropriately", { expect_equal(ncol(col_subset2), 2L) # Row and col subset that contains geo_value and time_value - should be epi_df - row_col_subset2 <- toy_epi_df[2:3, 1:3] + row_col_subset2 <- toy_epi_df[2:3, c(1, 4)] att_row_col_subset2 <- attr(row_col_subset2, "metadata") expect_true(is_epi_df(row_col_subset2)) expect_equal(nrow(row_col_subset2), 2L) - expect_equal(ncol(row_col_subset2), 3L) + expect_equal(ncol(row_col_subset2), 2L) expect_identical(att_row_col_subset2$geo_type, att_toy$geo_type) expect_identical(att_row_col_subset2$time_type, att_toy$time_type) expect_identical(att_row_col_subset2$as_of, att_toy$as_of) - expect_identical(att_row_col_subset2$other_keys, att_toy$other_keys[1]) }) test_that("When duplicate cols in subset should abort", { expect_error(toy_epi_df[, c(2, 2:3, 4, 4, 4)], - "Duplicated column names: time_value, indic_var2", + "Duplicated column names: indic_var1, time_value", fixed = TRUE ) expect_error(toy_epi_df[1:4, c(1, 2:4, 1)], @@ -94,7 +93,7 @@ test_that("When duplicate cols in subset should abort", { test_that("Correct metadata when subset includes some of other_keys", { # Only include other_var of indic_var1 - only_indic_var1 <- toy_epi_df[, c(1:3, 5:6)] + only_indic_var1 <- toy_epi_df[, c(1:2, 4:6)] att_only_indic_var1 <- attr(only_indic_var1, "metadata") expect_true(is_epi_df(only_indic_var1)) @@ -106,7 +105,7 @@ test_that("Correct metadata when subset includes some of other_keys", { expect_identical(att_only_indic_var1$other_keys, att_toy$other_keys[-2]) # Only include other_var of indic_var2 - only_indic_var2 <- toy_epi_df[, c(1:2, 4:6)] + only_indic_var2 <- toy_epi_df[, c(1, 3:6)] att_only_indic_var2 <- attr(only_indic_var2, "metadata") expect_true(is_epi_df(only_indic_var2)) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index 9135e5a9..a159f98e 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -232,6 +232,24 @@ test_that("as_slide_computation raises errors as expected", { ) }) +test_that("as_slide_computation works", { + f1 <- as_slide_computation(~ .z - .x$time_value, + .ref_time_value_long_varnames = character(0L), + .ref_time_value_label = "third argument" + ) + expect_equal(f1(tibble::tibble(time_value = 10), tibble::tibble(), 12), 2) + f2 <- as_time_slide_computation(~ .ref_time_value - .x$time_value) + expect_equal(f2(tibble::tibble(time_value = 10), tibble::tibble(), 12), 2) + f3 <- as_diagonal_slide_computation(~ .version - .x$time_value) + expect_equal(f3(tibble::tibble(time_value = 10), tibble::tibble(), 12), 2) + f4 <- as_diagonal_slide_computation(~ .ref_time_value - .x$time_value) + expect_equal(f4(tibble::tibble(time_value = 10), tibble::tibble(), 12), 2) + g <- as_time_slide_computation(~ -1 * .) + expect_equal(g(4), -4) + h <- as_time_slide_computation(~ .x - .group_key) + expect_equal(h(6, 3), 3) +}) + test_that("guess_period works", { # Error cases: expect_error(guess_period(numeric(0L)), class = "epiprocess__guess_period__not_enough_times") diff --git a/vignettes/advanced.Rmd b/vignettes/advanced.Rmd deleted file mode 100644 index 65f9ce05..00000000 --- a/vignettes/advanced.Rmd +++ /dev/null @@ -1,488 +0,0 @@ ---- -title: Advanced sliding with nonstandard outputs -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Advanced sliding with nonstandard outputs} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -In this vignette, we discuss how to use the sliding functionality in the -`epiprocess` package with less common grouping schemes or with computations that -have advanced output structures. The output of a slide computation should either -be an atomic value/vector, or a data frame. This data frame can have multiple -columns, multiple rows, or both. - -During basic usage (e.g., when all optional arguments are set to their defaults): - -* `epi_slide(edf, , .....)`: - * keeps **all** columns of `edf`, adds computed column(s) - * outputs **one row per row in `edf`** (recycling outputs from - computations appropriately if there are multiple time series bundled - together inside any group(s)) - * maintains the grouping or ungroupedness of `edf` - * is roughly analogous to (the non-sliding) **`dplyr::mutate` followed by - `dplyr::arrange(time_value, .by_group = TRUE)`** - * outputs an **`epi_df`** if the required columns are present, otherwise a - tibble -* `epix_slide(ea, , .....)`: - * keeps **grouping and `time_value`** columns of `ea`, adds computed - column(s) - * outputs **any number of rows** (computations are allowed to output any - number of elements/rows, and no recycling is performed) - * maintains the grouping or ungroupedness of `ea`, unless it was explicitly - grouped by zero variables; this isn't supported by `grouped_df` and it will - automatically turn into an ungrouped tibble - * is roughly analogous to (the non-sliding) **`dplyr::group_modify`** - * outputs a **tibble** - -These differences in basic behavior make some common slide operations require less boilerplate: - -* predictors and targets calculated with `epi_slide` are automatically lined up - with each other and with the signals from which they were calculated; and -* computations for an `epix_slide` can output data frames with any number of - rows, containing models, forecasts, evaluations, etc., and will not be - recycled. - -When using more advanced features, more complex rules apply: - -* Generalization: `epi_slide(edf, ....., .ref_time_values=my_ref_time_values)` - will output one row for every row in `edf` with `time_value` appearing inside - `my_ref_time_values`, and is analogous to a `dplyr::mutate`&`dplyr::arrange` - followed by `dplyr::filter` to those `.ref_time_values`. We call this property - **size stability**, and describe how it is achieved in the following sections. - The default behavior described above is a special case of this general rule - based on a default value of `.ref_time_values`. -* Exception/feature: `epi_slide(edf, ....., .ref_time_values=my_ref_time_values, - .all_rows=TRUE)` will not just output rows for `my_ref_time_values`, but - instead will output one row per row in `edf`. -* Clarification: `ea %>% group_by(....., .drop=FALSE) %>% - epix_slide(, .....)` will call the computation on any missing - groups according to `dplyr`'s `.drop=FALSE` rules, resulting in additional - output rows. - -Below we demonstrate some advanced use cases of sliding with different output -structures. We focus on `epi_slide()` for the most part, though some of the -behavior we demonstrate also carries over to `epix_slide()`. - -## Recycling outputs - -When a computation returns a single atomic value, `epi_slide()` will internally -try to recycle the output so that it is size stable (in the sense described -above). We can use this to our advantage, for example, in order to compute a -trailing average marginally over geo values, which we demonstrate below in a -simple synthetic example. - -```{r message = FALSE} -library(epiprocess) -library(dplyr) -set.seed(123) - -edf <- tibble( - geo_value = rep(c("ca", "fl", "pa"), each = 3), - time_value = rep(seq(as.Date("2020-06-01"), as.Date("2020-06-03"), by = "day"), length.out = length(geo_value)), - x = seq_along(geo_value) + 0.01 * rnorm(length(geo_value)), -) %>% - as_epi_df(as_of = as.Date("2024-03-20")) - -# 2-day trailing average, per geo value -edf %>% - group_by(geo_value) %>% - epi_slide(x_2dav = mean(x), .window_size = 2) %>% - ungroup() - -# 2-day trailing average, marginally -edf %>% - epi_slide(x_2dav = mean(x), .window_size = 2) -``` - -```{r, include = FALSE} -# More checks (not included) -edf %>% - epi_slide(x_2dav = mean(x), .window_size = 2, .ref_time_values = as.Date("2020-06-02")) - -edf %>% - # pretend that observations about time_value t are reported in version t (nowcasts) - mutate(version = time_value) %>% - as_epi_archive() %>% - group_by(geo_value) %>% - epix_slide(x_2dav = mean(x), .before = 1, .versions = as.Date("2020-06-02")) %>% - ungroup() - -edf %>% - # pretend that observations about time_value t are reported in version t (nowcasts) - mutate(version = time_value) %>% - as_epi_archive() %>% - group_by(geo_value) %>% - epix_slide(~ mean(.x$x), .before = 1, .ref_time_values = as.Date("2020-06-02")) %>% - ungroup() -``` - -When the slide computation returns an atomic vector (rather than a single value) -`epi_slide()` checks whether its return length ensures size stability, and if -so, uses it to fill the new column. For example, this next computation gives the -same result as the last one. - -```{r} -edf %>% - epi_slide(y_2dav = rep(mean(x), 3), .window_size = 2) -``` - -However, if the output is an atomic vector (rather than a single value) and it -is *not* size stable, then `epi_slide()` throws an error. For example, below we -are trying to return 2 things for 3 states. - -```{r, error = TRUE} -edf %>% - epi_slide(x_2dav = rep(mean(x), 2), .window_size = 2) -``` - -## Multi-column outputs - -Now we move on to outputs that are data frames with a single row but multiple -columns. Working with this type of output structure has in fact has already been -demonstrated in the [slide -vignette](https://cmu-delphi.github.io/epiprocess/articles/slide.html). - -```{r} -edf2 <- edf %>% - group_by(geo_value) %>% - epi_slide( - a = list(data.frame(x_2dav = mean(x), x_2dma = mad(x))), - .window_size = 2 - ) %>% - ungroup() - -class(edf2$a) -length(edf2$a) -edf2$a[[2]] -``` - -If you do not wrap the data.frame in a list above, the resulting `epi_df` has -multiple new columns containing the slide values. The default is to name these -unnested columns by prefixing the name assigned to the list column (here `a`) -onto the column names of the output data frame from the slide computation (here -`x_2dav` and `x_2dma`) separated by "_". - -```{r} -edf %>% - group_by(geo_value) %>% - epi_slide( - a = data.frame(x_2dav = mean(x), x_2dma = mad(x)), - .window_size = 2 - ) %>% - ungroup() -``` - -Furthermore, `epi_slide()` will recycle the single row data frame as needed in -order to make the result size stable, just like the case for atomic values (note -that we are not grouping here by geo_value). - -```{r} -edf %>% - epi_slide( - a = data.frame(x_2dav = mean(x), x_2dma = mad(x)), - .window_size = 2 - ) -``` - -## Multi-row outputs - -For a slide computation that outputs a data frame with more than one row, the -behavior is analogous to a slide computation that outputs an atomic vector. -Meaning, `epi_slide()` will check that the result is size stable, and if so, -will fill the new column(s) in the resulting `epi_df` object appropriately. - -This can be convenient for modeling in the following sense: we can, for example, -fit a sliding, data-versioning-unaware nowcasting or forecasting model by -pooling data from different locations, and then return separate forecasts from -this common model for each location. We use our synthetic example to demonstrate -this idea abstractly but simply by forecasting (actually, nowcasting) `y` from -`x` by fitting a time-windowed linear model that pooling data across all -locations. - -```{r} -edf$y <- 2 * edf$x + 0.05 * rnorm(length(edf$x)) - -edf %>% - epi_slide(function(d, group_key, ref_time_value) { - obj <- lm(y ~ x, data = d) - return( - predict( - obj, - newdata = d %>% group_by(geo_value) %>% filter(time_value == max(time_value)), - interval = "prediction", - level = 0.9 - ) %>% - as.data.frame() %>% - list() - ) - }, .window_size = 2) -``` - -The above example focused on simplicity to show how to work with multi-row -outputs. Note however, the following issues in this example: - -* The `lm` fitting data includes the testing instances, as no training-test split was performed. -* Adding a simple training-test split would not factor in reporting latency properly. -* Data revisions are not taken into account. - -All three of these factors contribute to unrealistic retrospective forecasts and -overly optimistic retrospective performance evaluations. Instead, one should -favor an `epix_slide` for more realistic "pseudoprospective" forecasts. Using -`epix_slide` also makes it easier to express certain types of forecasts; while -in `epi_slide`, forecasts for additional aheads or quantile levels would need to -be expressed as additional columns, or nested inside list columns, `epix_slide` -does not perform size stability checks or recycling, allowing computations to -output any number of rows. - -## Version-aware forecasting, revisited - -We revisit the COVID-19 forecasting example from the [archive -vignette](https://cmu-delphi.github.io/epiprocess/articles/slide.html) in order -to demonstrate the preceding points regarding forecast evaluation in a more -realistic setting. First, we fetch the versioned data and build the archive. - -```{r, message = FALSE, warning = FALSE, eval =FALSE} -library(epidatr) -library(data.table) -library(ggplot2) -theme_set(theme_bw()) - -y1 <- pub_covidcast( - source = "doctor-visits", - signals = "smoothed_adj_cli", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl", - time_values = epirange(20200601, 20211201), - issues = epirange(20200601, 20211201) -) - -y2 <- pub_covidcast( - source = "jhu-csse", - signal = "confirmed_7dav_incidence_prop", - geo_type = "state", - time_type = "day", - geo_values = "ca,fl", - time_values = epirange(20200601, 20211201), - issues = epirange(20200601, 20211201) -) - -x <- y1 %>% - select(geo_value, time_value, - version = issue, - percent_cli = value - ) %>% - as_epi_archive(compactify = FALSE) - -# mutating merge operation: -x <- epix_merge( - x, - y2 %>% - select(geo_value, time_value, - version = issue, - case_rate_7d_av = value - ) %>% - as_epi_archive(compactify = FALSE), - sync = "locf", - compactify = FALSE -) -``` - -```{r, message = FALSE, echo =FALSE} -library(data.table) -library(ggplot2) -theme_set(theme_bw()) - -x <- archive_cases_dv_subset$DT %>% - filter(geo_value %in% c("ca", "fl")) %>% - as_epi_archive(compactify = FALSE) -``` - -Next, we extend the ARX function to handle multiple geo values, since in the -present case, we will not be grouping by geo value and each slide computation -will be run on multiple geo values at once. Note that, because `epix_slide()` -only returns the grouping variables, `time_value`, and the slide computations in -the eventual returned tibble, we need to include `geo_value` as a column in the -output data frame from our ARX computation. - -```{r} -library(tidyr) -library(purrr) - -prob_arx_args <- function(lags = c(0, 7, 14), - ahead = 7, - min_train_window = 20, - lower_level = 0.05, - upper_level = 0.95, - symmetrize = TRUE, - intercept = FALSE, - nonneg = TRUE) { - return(list( - lags = lags, - ahead = ahead, - min_train_window = min_train_window, - lower_level = lower_level, - upper_level = upper_level, - symmetrize = symmetrize, - intercept = intercept, - nonneg = nonneg - )) -} - -prob_arx <- function(x, y, geo_value, time_value, args = prob_arx_args()) { - # Return NA if insufficient training data - if (length(y) < args$min_train_window + max(args$lags) + args$ahead) { - return(data.frame( - geo_value = unique(geo_value), # Return geo value! - point = NA, lower = NA, upper = NA - )) - } - - # Set up x, y, lags list - if (!missing(x)) { - x <- data.frame(x, y) - } else { - x <- data.frame(y) - } - if (!is.list(args$lags)) args$lags <- list(args$lags) - args$lags <- rep(args$lags, length.out = ncol(x)) - - # Build features and response for the AR model, and then fit it - dat <- - tibble(i = seq_len(ncol(x)), lag = args$lags) %>% - unnest(lag) %>% - mutate(name = paste0("x", seq_len(nrow(.)))) %>% # nolint: object_usage_linter - # One list element for each lagged feature - pmap(function(i, lag, name) { - tibble( - geo_value = geo_value, - time_value = time_value + lag, # Shift back - !!name := x[, i] - ) - }) %>% - # One list element for the response vector - c(list( - tibble( - geo_value = geo_value, - time_value = time_value - args$ahead, # Shift forward - y = y - ) - )) %>% - # Combine them together into one data frame - reduce(full_join, by = c("geo_value", "time_value")) %>% - arrange(time_value) - if (args$intercept) dat$x0 <- rep(1, nrow(dat)) - obj <- lm(y ~ . + 0, data = select(dat, -geo_value, -time_value)) - - # Use LOCF to fill NAs in the latest feature values (do this by geo value) - setDT(dat) # Convert to a data.table object by reference - cols <- setdiff(names(dat), c("geo_value", "time_value")) - dat[, (cols) := nafill(.SD, type = "locf"), .SDcols = cols, by = "geo_value"] - - # Make predictions - test_time_value <- max(time_value) - point <- predict( - obj, - newdata = dat %>% - dplyr::group_by(geo_value) %>% - dplyr::filter(time_value == test_time_value) - ) - - # Compute bands - r <- residuals(obj) - s <- ifelse(args$symmetrize, -1, NA) # Should the residuals be symmetrized? - q <- quantile(c(r, s * r), probs = c(args$lower, args$upper), na.rm = TRUE) - lower <- point + q[1] - upper <- point + q[2] - - # Clip at zero if we need to, then return - if (args$nonneg) { - point <- pmax(point, 0) - lower <- pmax(lower, 0) - upper <- pmax(upper, 0) - } - return(data.frame( - geo_value = unique(geo_value), # Return geo value! - point = point, lower = lower, upper = upper - )) -} -``` - -We now make forecasts on the archive and compare to forecasts on the latest -data. - -```{r, message = FALSE, warning = FALSE, fig.width = 9, fig.height = 6} -# Latest snapshot of data, and forecast dates -x_latest <- epix_as_of(x, max_version = max(x$DT$version)) -fc_time_values <- seq(as.Date("2020-08-01"), - as.Date("2021-11-30"), - by = "1 month" -) - -# Simple function to produce forecasts k weeks ahead -k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { - if (as_of) { - x %>% - epix_slide( - fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, .data$geo_value, .data$time_value, - args = prob_arx_args(ahead = ahead) - ), - .before = 219, .versions = fc_time_values - ) %>% - mutate( - target_date = .data$time_value + ahead, as_of = TRUE, - geo_value = .data$fc$geo_value - ) - } else { - x_latest %>% - epi_slide( - fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, .data$geo_value, .data$time_value, - args = prob_arx_args(ahead = ahead) - ), - .window_size = 220, .ref_time_values = fc_time_values - ) %>% - mutate(target_date = .data$time_value + ahead, as_of = FALSE) - } -} - -# Generate the forecasts, and bind them together -fc <- bind_rows( - k_week_ahead(x, ahead = 7, as_of = TRUE), - k_week_ahead(x, ahead = 14, as_of = TRUE), - k_week_ahead(x, ahead = 21, as_of = TRUE), - k_week_ahead(x, ahead = 28, as_of = TRUE), - k_week_ahead(x, ahead = 7, as_of = FALSE), - k_week_ahead(x, ahead = 14, as_of = FALSE), - k_week_ahead(x, ahead = 21, as_of = FALSE), - k_week_ahead(x, ahead = 28, as_of = FALSE) -) - -# Plot them, on top of latest COVID-19 case rates -ggplot(fc, aes(x = target_date, group = time_value, fill = as_of)) + - geom_ribbon(aes(ymin = fc$lower, ymax = fc$upper), alpha = 0.4) + - geom_line( - data = x_latest, aes(x = time_value, y = case_rate_7d_av), - inherit.aes = FALSE, color = "gray50" - ) + - geom_line(aes(y = fc$point)) + - geom_point(aes(y = fc$point), size = 0.5) + - geom_vline(aes(xintercept = time_value), linetype = 2, alpha = 0.5) + - facet_grid(vars(geo_value), vars(as_of), scales = "free") + - scale_x_date(minor_breaks = "month", date_labels = "%b %y") + - labs(x = "Date", y = "Reported COVID-19 case rates") + - theme(legend.position = "none") -``` - -We can see that these forecasts, which come from training an ARX model jointly -over CA and FL, exhibit generally less variability and wider prediction bands -compared to the ones from the archive vignette, which come from training a -separate ARX model on each state. As in the archive vignette, we can see a -difference between version-aware (right column) and -unaware (left column) -forecasting, as well. - -## Attribution -The `case_rate_7d_av` data used in this document is a modified part of the [COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University](https://github.com/CSSEGISandData/COVID-19) as [republished in the COVIDcast Epidata API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html). This data set is licensed under the terms of the [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/) by the Johns Hopkins University on behalf of its Center for Systems Science in Engineering. Copyright Johns Hopkins University 2020. - -The `percent_cli` data is a modified part of the [COVIDcast Epidata API Doctor Visits data](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html). This dataset is licensed under the terms of the [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/). Copyright Delphi Research Group at Carnegie Mellon University 2020. diff --git a/vignettes/aggregation.Rmd b/vignettes/aggregation.Rmd index 585b5b0a..9d205f53 100644 --- a/vignettes/aggregation.Rmd +++ b/vignettes/aggregation.Rmd @@ -52,13 +52,12 @@ x <- jhu_csse_county_level_subset ## Converting to `tsibble` format For manipulating and wrangling time series data, the -[`tsibble`](https://tsibble.tidyverts.org/index.html) already provides a whole -bunch of useful tools. A tsibble object (formerly, of class `tbl_ts`) is -basically a tibble (data frame) but with two specially-marked columns: an -**index** column representing the time variable (defining an order from past to -present), and a **key** column identifying a unique observational unit for each -time point. In fact, the key can be made up of any number of columns, not just a -single one. +[`tsibble`](https://tsibble.tidyverts.org/index.html) already provides a host of +useful tools. A tsibble object (formerly, of class `tbl_ts`) is basically a +tibble (data frame) but with two specially-marked columns: an **index** column +representing the time variable (defining an order from past to present), and a +**key** column identifying a unique observational unit for each time point. In +fact, the key can be made up of any number of columns, not just a single one. In an `epi_df` object, the index variable is `time_value`, and the key variable is typically `geo_value` (though this need not always be the case: for example, @@ -113,11 +112,13 @@ Let's first remove certain dates from our data set to create gaps: ```{r} # First make geo value more readable for tables, plots, etc. x <- x %>% - mutate(geo_value = paste( - substr(county_name, 1, nchar(county_name) - 7), - name_to_abbr(state_name), - sep = ", " - )) %>% + mutate( + geo_value = paste( + substr(county_name, 1, nchar(county_name) - 7), + name_to_abbr(state_name), + sep = ", " + ) + ) %>% select(geo_value, time_value, cases) xt <- as_tsibble(x) %>% filter(cases >= 3) diff --git a/vignettes/archive.Rmd b/vignettes/archive.Rmd index 07413126..62eea2aa 100644 --- a/vignettes/archive.Rmd +++ b/vignettes/archive.Rmd @@ -51,6 +51,10 @@ library(data.table) library(dplyr) library(purrr) library(ggplot2) +dv <- archive_cases_dv_subset$DT %>% + select(-case_rate_7d_av) %>% + rename(issue = version, value = percent_cli) %>% + tibble() ``` ## Getting data into `epi_archive` format @@ -72,7 +76,7 @@ format, with `issue` playing the role of `version`. We can now use redundant version updates in `as_epi_archive` using compactify, please refer to the [compactify vignette](articles/compactify.html). -```{r, eval=FALSE} +```{r} x <- dv %>% select(geo_value, time_value, version = issue, percent_cli = value) %>% as_epi_archive(compactify = TRUE) @@ -81,15 +85,6 @@ class(x) print(x) ``` -```{r, echo=FALSE, message=FALSE, warning=FALSE} -x <- archive_cases_dv_subset$DT %>% - select(geo_value, time_value, version, percent_cli) %>% - as_epi_archive(compactify = TRUE) - -class(x) -print(x) -``` - An `epi_archive` is consists of a primary field `DT`, which is a data table (from the `data.table` package) that has the columns `geo_value`, `time_value`, `version` (and possibly additional ones), and other metadata fields, such as @@ -127,17 +122,27 @@ object is instantiated, if they are not explicitly specified in the function call (as it did in the case above). ## Summarizing Revision Behavior -There are many ways to examine the ways that signals change across different revisions. -The simplest that is included directly in epiprocess is `revision_summary()`, which computes simple summary statistics for each key (by default, `(geo_value,time_value)` pairs), such as the lag to the first value (latency). In addition to the per key summary, it also returns an overall summary: + +There are many ways to examine the ways that signals change across different +revisions. The simplest that is included directly in epiprocess is +`revision_summary()`, which computes simple summary statistics for each key (by +default, `(geo_value,time_value)` pairs), such as the lag to the first value +(latency). In addition to the per key summary, it also returns an overall +summary: + ```{r} revision_details <- revision_summary(x, print_inform = TRUE) ``` -So as was mentioned at the top, this is clearly a data set where basically everything has some amount of revisions, only 0.37% have no revision at all, and 0.92 have fewer than 3. -Over 94% change by more than 10%. -On the other hand, most are within plus or minus 20% within 5-9 days, so the revisions converge relatively quickly, even if the revisions continue for longer. +So as was mentioned at the top, this is clearly a data set where basically +everything has some amount of revisions, only 0.37% have no revision at all, and +0.92 have fewer than 3. Over 94% change by more than 10%. On the other hand, +most are within plus or minus 20% within 5-9 days, so the revisions converge +relatively quickly, even if the revisions continue for longer. + +To do more detailed analysis than is possible with the above printing, we have +`revision_details`: -To do more detailed analysis than is possible with the above printing, we have `revision_details`: ```{r} revision_details %>% group_by(geo_value) %>% @@ -150,13 +155,16 @@ revision_details %>% time_near_latest = mean(time_near_latest) ) ``` -Most of the states have similar stats on most of these features, except for Florida, which takes nearly double the amount of time to get close to the right value, with California not too far behind. + +Most of the states have similar stats on most of these features, except for +Florida, which takes nearly double the amount of time to get close to the right +value, with California not too far behind. ## Producing snapshots in `epi_df` form -A key method of an `epi_archive` class is `epix_as_of()`, which generates a snapshot -of the archive in `epi_df` format. This represents the most up-to-date values of -the signal variables as of a given version. +A key method of an `epi_archive` class is `epix_as_of()`, which generates a +snapshot of the archive in `epi_df` format. This represents the most up-to-date +values of the signal variables as of a given version. ```{r} x_snapshot <- epix_as_of(x, as.Date("2021-06-01")) @@ -180,6 +188,7 @@ latest snapshot `x_latest` that the archive can provide). ```{r, fig.width = 8, fig.height = 7} theme_set(theme_bw()) +x_latest <- epix_as_of(x, x$versions_end) self_max <- max(x$DT$version) versions <- seq(as.Date("2020-06-01"), self_max - 1, by = "1 month") snapshots <- map_dfr(versions, function(v) { @@ -237,7 +246,7 @@ When merging archives, unless the archives have identical data release patterns, download the currently available version data for one of the archives, but not the other). -```{r, message = FALSE, warning = FALSE,eval=FALSE} +```{r, message = FALSE, warning = FALSE, eval=FALSE} y <- pub_covidcast( source = "jhu-csse", signals = "confirmed_7dav_incidence_prop", @@ -337,15 +346,13 @@ Next we slide this forecaster over the working `epi_archive` object, in order to forecast COVID-19 case rates 7 days into the future. ```{r} -fc_time_values <- seq(as.Date("2020-08-01"), - as.Date("2021-11-30"), - by = "1 month" -) +fc_time_values <- seq(as.Date("2020-08-01"), as.Date("2021-11-30"), by = "1 month") z <- x %>% group_by(geo_value) %>% epix_slide( - fc = prob_arx(x = percent_cli, y = case_rate_7d_av), .before = 119, + fc = prob_arx(x = percent_cli, y = case_rate_7d_av, ahead = 7), + .before = 119, .versions = fc_time_values ) %>% ungroup() @@ -353,8 +360,6 @@ z <- x %>% head(z, 10) ``` - - We get back a tibble `z` with the grouping variables (here geo value), the (reference) time values, and a ["packed"][tidyr::pack] data frame column `fc` containing `fc$point`, `fc$lower`, and `fc$upper` that correspond to the point @@ -377,22 +382,22 @@ points in time and forecast horizons. The former comes from using x_latest <- epix_as_of(x, x$versions_end) # Simple function to produce forecasts k weeks ahead -k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { +forecast_k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { if (as_of) { x %>% - group_by(.data$geo_value) %>% + group_by(geo_value) %>% epix_slide( fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, ahead = ahead), .before = 119, .versions = fc_time_values ) %>% - mutate(target_date = .data$time_value + ahead, as_of = TRUE) %>% + mutate(target_date = .data$version + ahead, as_of = TRUE) %>% ungroup() } else { x_latest %>% - group_by(.data$geo_value) %>% + group_by(geo_value) %>% epi_slide( fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, ahead = ahead), .window_size = 120, - .versions = fc_time_values + .ref_time_values = fc_time_values ) %>% mutate(target_date = .data$time_value + ahead, as_of = FALSE) %>% ungroup() @@ -401,14 +406,14 @@ k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { # Generate the forecasts, and bind them together fc <- bind_rows( - k_week_ahead(x, ahead = 7, as_of = TRUE), - k_week_ahead(x, ahead = 14, as_of = TRUE), - k_week_ahead(x, ahead = 21, as_of = TRUE), - k_week_ahead(x, ahead = 28, as_of = TRUE), - k_week_ahead(x, ahead = 7, as_of = FALSE), - k_week_ahead(x, ahead = 14, as_of = FALSE), - k_week_ahead(x, ahead = 21, as_of = FALSE), - k_week_ahead(x, ahead = 28, as_of = FALSE) + forecast_k_week_ahead(x, ahead = 7, as_of = TRUE), + forecast_k_week_ahead(x, ahead = 14, as_of = TRUE), + forecast_k_week_ahead(x, ahead = 21, as_of = TRUE), + forecast_k_week_ahead(x, ahead = 28, as_of = TRUE), + forecast_k_week_ahead(x, ahead = 7, as_of = FALSE), + forecast_k_week_ahead(x, ahead = 14, as_of = FALSE), + forecast_k_week_ahead(x, ahead = 21, as_of = FALSE), + forecast_k_week_ahead(x, ahead = 28, as_of = FALSE) ) # Plot them, on top of latest COVID-19 case rates @@ -447,9 +452,250 @@ to look for more robust forecasting methodology. The forecasters that appear in the vignettes in the current package are only meant to demo the slide functionality with some of the most basic forecasting methodology possible. +## Sliding version-aware computations with geo-pooling + +First, we fetch the versioned data and build the archive. + +```{r, message = FALSE, warning = FALSE, eval =FALSE} +library(epidatr) +library(data.table) +library(ggplot2) +theme_set(theme_bw()) + +y1 <- pub_covidcast( + source = "doctor-visits", + signals = "smoothed_adj_cli", + geo_type = "state", + time_type = "day", + geo_values = "ca,fl", + time_values = epirange(20200601, 20211201), + issues = epirange(20200601, 20211201) +) + +y2 <- pub_covidcast( + source = "jhu-csse", + signal = "confirmed_7dav_incidence_prop", + geo_type = "state", + time_type = "day", + geo_values = "ca,fl", + time_values = epirange(20200601, 20211201), + issues = epirange(20200601, 20211201) +) + +x <- y1 %>% + select(geo_value, time_value, + version = issue, + percent_cli = value + ) %>% + as_epi_archive(compactify = FALSE) + +# mutating merge operation: +x <- epix_merge( + x, + y2 %>% + select(geo_value, time_value, + version = issue, + case_rate_7d_av = value + ) %>% + as_epi_archive(compactify = FALSE), + sync = "locf", + compactify = FALSE +) +``` + +```{r, message = FALSE, echo =FALSE} +library(data.table) +library(ggplot2) +theme_set(theme_bw()) + +x <- archive_cases_dv_subset$DT %>% + filter(geo_value %in% c("ca", "fl")) %>% + as_epi_archive(compactify = FALSE) +``` + +Next, we extend the ARX function to handle multiple geo values, since in the +present case, we will not be grouping by geo value and each slide computation +will be run on multiple geo values at once. Note that, because `epix_slide()` +only returns the grouping variables, `time_value`, and the slide computations in +the eventual returned tibble, we need to include `geo_value` as a column in the +output data frame from our ARX computation. + +```{r} +library(tidyr) +library(purrr) + +prob_arx_args <- function(lags = c(0, 7, 14), + ahead = 7, + min_train_window = 20, + lower_level = 0.05, + upper_level = 0.95, + symmetrize = TRUE, + intercept = FALSE, + nonneg = TRUE) { + return(list( + lags = lags, + ahead = ahead, + min_train_window = min_train_window, + lower_level = lower_level, + upper_level = upper_level, + symmetrize = symmetrize, + intercept = intercept, + nonneg = nonneg + )) +} + +prob_arx <- function(x, y, geo_value, time_value, args = prob_arx_args()) { + # Return NA if insufficient training data + if (length(y) < args$min_train_window + max(args$lags) + args$ahead) { + return(data.frame( + geo_value = unique(geo_value), # Return geo value! + point = NA, lower = NA, upper = NA + )) + } + + # Set up x, y, lags list + if (!missing(x)) { + x <- data.frame(x, y) + } else { + x <- data.frame(y) + } + if (!is.list(args$lags)) args$lags <- list(args$lags) + args$lags <- rep(args$lags, length.out = ncol(x)) + + # Build features and response for the AR model, and then fit it + dat <- tibble(i = seq_len(ncol(x)), lag = args$lags) %>% + unnest(lag) %>% + mutate(name = paste0("x", seq_len(nrow(.)))) %>% # nolint: object_usage_linter + # One list element for each lagged feature + pmap(function(i, lag, name) { + tibble( + geo_value = geo_value, + time_value = time_value + lag, # Shift back + !!name := x[, i] + ) + }) %>% + # One list element for the response vector + c(list( + tibble( + geo_value = geo_value, + time_value = time_value - args$ahead, # Shift forward + y = y + ) + )) %>% + # Combine them together into one data frame + reduce(full_join, by = c("geo_value", "time_value")) %>% + arrange(time_value) + if (args$intercept) dat$x0 <- rep(1, nrow(dat)) + obj <- lm(y ~ . + 0, data = select(dat, -geo_value, -time_value)) + + # Use LOCF to fill NAs in the latest feature values (do this by geo value) + setDT(dat) # Convert to a data.table object by reference + cols <- setdiff(names(dat), c("geo_value", "time_value")) + dat[, (cols) := nafill(.SD, type = "locf"), .SDcols = cols, by = "geo_value"] + + # Make predictions + test_time_value <- max(time_value) + point <- predict( + obj, + newdata = dat %>% + dplyr::group_by(geo_value) %>% + dplyr::filter(time_value == test_time_value) + ) + + # Compute bands + r <- residuals(obj) + s <- ifelse(args$symmetrize, -1, NA) # Should the residuals be symmetrized? + q <- quantile(c(r, s * r), probs = c(args$lower, args$upper), na.rm = TRUE) + lower <- point + q[1] + upper <- point + q[2] + + # Clip at zero if we need to, then return + if (args$nonneg) { + point <- pmax(point, 0) + lower <- pmax(lower, 0) + upper <- pmax(upper, 0) + } + return(data.frame( + geo_value = unique(geo_value), # Return geo value! + point = point, lower = lower, upper = upper + )) +} +``` + +We now make forecasts on the archive and compare to forecasts on the latest +data. + +```{r, message = FALSE, warning = FALSE, fig.width = 9, fig.height = 6} +# Latest snapshot of data, and forecast dates +x_latest <- epix_as_of(x, version = max(x$DT$version)) +fc_time_values <- seq(as.Date("2020-08-01"), + as.Date("2021-11-30"), + by = "1 month" +) + +# Simple function to produce forecasts k weeks ahead +forecast_k_week_ahead <- function(x, ahead = 7, as_of = TRUE) { + if (as_of) { + x %>% + epix_slide( + fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, .data$geo_value, .data$time_value, + args = prob_arx_args(ahead = ahead) + ), + .before = 219, .versions = fc_time_values + ) %>% + mutate( + target_date = .data$version + ahead, as_of = TRUE, + geo_value = .data$fc$geo_value + ) + } else { + x_latest %>% + epi_slide( + fc = prob_arx(.data$percent_cli, .data$case_rate_7d_av, .data$geo_value, .data$time_value, + args = prob_arx_args(ahead = ahead) + ), + .window_size = 220, .ref_time_values = fc_time_values + ) %>% + mutate(target_date = .data$time_value + ahead, as_of = FALSE) + } +} + +# Generate the forecasts, and bind them together +fc <- bind_rows( + forecast_k_week_ahead(x, ahead = 7, as_of = TRUE), + forecast_k_week_ahead(x, ahead = 14, as_of = TRUE), + forecast_k_week_ahead(x, ahead = 21, as_of = TRUE), + forecast_k_week_ahead(x, ahead = 28, as_of = TRUE), + forecast_k_week_ahead(x, ahead = 7, as_of = FALSE), + forecast_k_week_ahead(x, ahead = 14, as_of = FALSE), + forecast_k_week_ahead(x, ahead = 21, as_of = FALSE), + forecast_k_week_ahead(x, ahead = 28, as_of = FALSE) +) + +# Plot them, on top of latest COVID-19 case rates +ggplot(fc, aes(x = target_date, group = time_value, fill = as_of)) + + geom_ribbon(aes(ymin = fc$lower, ymax = fc$upper), alpha = 0.4) + + geom_line( + data = x_latest, aes(x = time_value, y = case_rate_7d_av), + inherit.aes = FALSE, color = "gray50" + ) + + geom_line(aes(y = fc$point)) + + geom_point(aes(y = fc$point), size = 0.5) + + geom_vline(aes(xintercept = time_value), linetype = 2, alpha = 0.5) + + facet_grid(vars(geo_value), vars(as_of), scales = "free") + + scale_x_date(minor_breaks = "month", date_labels = "%b %y") + + labs(x = "Date", y = "Reported COVID-19 case rates") + + theme(legend.position = "none") +``` + +We can see that these forecasts, which come from training an ARX model jointly +over CA and FL, exhibit generally less variability and wider prediction bands +compared to the ones from the archive vignette, which come from training a +separate ARX model on each state. As in the archive vignette, we can see a +difference between version-aware (right column) and -unaware (left column) +forecasting, as well. + ## Attribution + This document contains a dataset that is a modified part of the [COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University](https://github.com/CSSEGISandData/COVID-19) as [republished in the COVIDcast Epidata API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html). This data set is licensed under the terms of the [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/) by the Johns Hopkins University on behalf of its Center for Systems Science in Engineering. Copyright Johns Hopkins University 2020. The `percent_cli` data is a modified part of the [COVIDcast Epidata API Doctor Visits data](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html). This dataset is licensed under the terms of the [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/). Copyright Delphi Research Group at Carnegie Mellon University 2020. - - diff --git a/vignettes/epiprocess.Rmd b/vignettes/epiprocess.Rmd index e6c78aba..b1840bb2 100644 --- a/vignettes/epiprocess.Rmd +++ b/vignettes/epiprocess.Rmd @@ -128,9 +128,7 @@ columns required for an `epi_df` object (along with many others). We can use frame into `epi_df` format. ```{r, message = FALSE} -x <- as_epi_df(cases, - as_of = max(cases$issue) -) %>% +x <- as_epi_df(cases, as_of = max(cases$issue)) %>% select(geo_value, time_value, total_cases = value) class(x) @@ -176,9 +174,11 @@ attributes(x)$metadata ``` ## Using additional key columns in `epi_df` + In the following examples we will show how to create an `epi_df` with additional keys. ### Converting a `tsibble` that has county code as an extra key + ```{r} ex1 <- tibble( geo_value = rep(c("ca", "fl", "pa"), each = 3), @@ -200,10 +200,10 @@ The metadata now includes `county_code` as an extra key. attr(ex1, "metadata") ``` - ### Dealing with misspecified column names `epi_df` requires there to be columns `geo_value` and `time_value`, if they do not exist then `as_epi_df()` throws an error. + ```{r, error = TRUE} data.frame( # misnamed @@ -211,12 +211,13 @@ data.frame( # extra key pol = rep(c("blue", "swing", "swing"), each = 3), # misnamed - reported_date = rep(seq(as.Date("2020-06-01"), as.Date("2020-06-03"), by = "day"), length.out = length(geo_value)), - value = seq_along(geo_value) + 0.01 * withr::with_rng_version("3.0.0", withr::with_seed(42, length(geo_value))) + reported_date = rep(seq(as.Date("2020-06-01"), as.Date("2020-06-03"), by = "day"), length.out = 9), + value = 1:9 + 0.01 * withr::with_rng_version("3.0.0", withr::with_seed(42, 9)) ) %>% as_epi_df(as_of = as.Date("2024-03-20")) ``` The columns can be renamed to match `epi_df` format. In the example below, notice there is also an additional key `pol`. + ```{r} ex2 <- tibble( # misnamed @@ -240,7 +241,6 @@ ex2 <- ex2 %>% attr(ex2, "metadata") ``` - ### Adding additional keys to an `epi_df` object In the above examples, all the keys are added to objects that are not `epi_df` objects. We illustrate how to add keys to an `epi_df` object. diff --git a/vignettes/growth_rate.Rmd b/vignettes/growth_rate.Rmd index abef646f..acbb53ee 100644 --- a/vignettes/growth_rate.Rmd +++ b/vignettes/growth_rate.Rmd @@ -22,6 +22,7 @@ library(tidyr) ``` The data is fetched with the following query: + ```{r, message = FALSE, eval=F} x <- pub_covidcast( source = "jhu-csse", @@ -38,7 +39,6 @@ x <- pub_covidcast( The data has 1,158 rows and 3 columns. - ```{r, echo=FALSE} data(jhu_csse_daily_subset) x <- jhu_csse_daily_subset %>% diff --git a/vignettes/outliers.Rmd b/vignettes/outliers.Rmd index ea3c30ac..1a2cfa41 100644 --- a/vignettes/outliers.Rmd +++ b/vignettes/outliers.Rmd @@ -127,11 +127,14 @@ vote across the base methods to determine whether a value is an outlier. ```{r} x <- x %>% group_by(geo_value) %>% - mutate(outlier_info = detect_outlr( - x = time_value, y = cases, - methods = detection_methods, - combiner = "median" - )) %>% + mutate( + outlier_info = detect_outlr( + x = time_value, + y = cases, + methods = detection_methods, + combiner = "median" + ) + ) %>% ungroup() %>% unnest(outlier_info) @@ -240,10 +243,9 @@ ggplot(y, aes(x = time_value)) + More advanced correction functionality will be coming at some point in the future. - ## Attribution + This document contains a dataset that is a modified part of the [COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University](https://github.com/CSSEGISandData/COVID-19) as [republished in the COVIDcast Epidata API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html). This data set is licensed under the terms of the [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/) by the Johns Hopkins University on behalf of its Center for Systems Science in Engineering. Copyright Johns Hopkins University 2020. [From the COVIDcast Epidata API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html): These signals are taken directly from the JHU CSSE [COVID-19 GitHub repository](https://github.com/CSSEGISandData/COVID-19) without changes. - diff --git a/vignettes/slide.Rmd b/vignettes/slide.Rmd index 7ec6cc9b..92d8456d 100644 --- a/vignettes/slide.Rmd +++ b/vignettes/slide.Rmd @@ -11,21 +11,19 @@ A central tool in the `epiprocess` package is `epi_slide()`, which is based on the powerful functionality provided in the [`slider`](https://cran.r-project.org/web/packages/slider) package. In `epiprocess`, to "slide" means to apply a computation---represented as a -function or formula---over a sliding/rolling data window. Suitable -groupings can always be achieved by a preliminary call to `group_by()`. +function or formula---over a sliding/rolling data window. The function always +applies the slide inside each group and the grouping is assumed to be across all +group keys of the `epi_df` (this is the grouping used by default if you do not +group the `epi_df` with a `group_by()`). -By default, the meaning of one time step is inferred from the `time_value` -column of the `epi_df` object under consideration, based on the way this column -understands addition and subtraction. For example, if the time values are coded -as `Date` objects, then one time step is one day, since `as.Date("2022-01-01") + -1` equals `as.Date("2022-01-02")`. Alternatively, the time step can be specified -manually in the call to `epi_slide()`; you can read the documentation for more -details. +By default, the `.window_size` units depend on the `time_type` of the `epi_df`, +which is determined from the types in the `time_value` column of the `epi_df`. +See the "Details" in `epi_slide()` for more. As in getting started guide, we'll fetch daily reported COVID-19 cases from CA, FL, NY, and TX (note: here we're using new, not cumulative cases) using the -[`epidatr`](https://github.com/cmu-delphi/epidatr) package, -and then convert this to `epi_df` format. +[`epidatr`](https://github.com/cmu-delphi/epidatr) package, and then convert +this to `epi_df` format. ```{r, message = FALSE, warning=FALSE} library(epidatr) @@ -34,8 +32,9 @@ library(dplyr) ``` The data is fetched with the following query: + ```{r, message = FALSE, eval=F} -x <- pub_covidcast( +edf <- pub_covidcast( source = "jhu-csse", signals = "confirmed_incidence_num", geo_type = "state", @@ -52,99 +51,106 @@ The data has 2,684 rows and 3 columns. ```{r, echo=FALSE} data(jhu_csse_daily_subset) -x <- jhu_csse_daily_subset %>% +edf <- jhu_csse_daily_subset %>% select(geo_value, time_value, cases) %>% arrange(geo_value, time_value) %>% as_epi_df() ``` -## Optimized rolling mean +## Optimized rolling mean and sums -We first demonstrate how to apply a 7-day trailing average to the daily cases -in order to smooth the signal, by passing in the name of the column(s) we -want to average for the first argument of `epi_slide_mean()`. `epi_slide_mean -()` can only be used for averaging. To do this computation per state, we -first call `group_by()`. +For the two most common sliding operations, we offer two optimized versions: +`epi_slide_mean()` and `epi_slide_sum()`. This example gets the 7-day trailing +average of the daily cases. Note that the name of the column(s) that we want to +average is specified as the first argument of `epi_slide_mean()`. ```{r} -x %>% +edf %>% group_by(geo_value) %>% - epi_slide_mean("cases", .window_size = 7) %>% + epi_slide_mean("cases", .window_size = 7, na.rm = TRUE) %>% ungroup() %>% head(10) ``` -The calculation is done using `data.table::frollmean`, whose behavior can be -adjusted by passing relevant arguments via `...`. +Note that we passed `na.rm = TRUE` to `data.table::frollmean()` via `...` to +`epi_slide_mean`. + +The following computes the 7-day trailing sum of daily cases (and passed `na.rm` +to `data.table::frollsum()` similarly): + +```{r} +edf %>% + group_by(geo_value) %>% + epi_slide_sum("cases", .window_size = 7, na.rm = TRUE) %>% + ungroup() %>% + head(10) +``` -## Slide with a formula +## General sliding with a formula -The previous computation can also be performed using `epi_slide()`, which is -more flexible but quite a bit slower than `epi_slide_mean()`. It is -recommended to use `epi_slide_mean()` when possible. +The previous computations can also be performed using `epi_slide()`, which can +be used for more general sliding computations (but is much slower for the +specific cases of mean and sum). The same 7-day trailing average of daily cases can be computed by passing in a -formula for the first argument of `epi_slide()`. To do this per state, we -first call `group_by()`. +formula for the first argument of `epi_slide()`: ```{r} -x %>% +edf %>% group_by(geo_value) %>% - epi_slide(~ mean(.x$cases), .window_size = 7) %>% + epi_slide(~ mean(.x$cases, na.rm = TRUE), .window_size = 7) %>% ungroup() %>% head(10) ``` -The formula specified has access to all non-grouping columns present in the -original `epi_df` object (and must refer to them with the prefix `.x$`). As we -can see, the function `epi_slide()` returns an `epi_df` object with a new column -appended that contains the results (from sliding), named `slide_value` as the -default. We can of course change this post hoc, or we can instead specify a new -name up front using the `.new_col_name` argument: +If your formula returns a data.frame, then the columns of the data.frame +will be unpacked into the resulting `epi_df`. For example, the following +computes the 7-day trailing average of daily cases and the 7-day trailing sum of +daily cases: ```{r} -x <- x %>% +edf %>% group_by(geo_value) %>% - epi_slide(~ mean(.x$cases), .window_size = 7, .new_col_name = "cases_7dav") %>% - ungroup() - -head(x, 10) + epi_slide( + ~ data.frame(cases_mean = mean(.x$cases, na.rm = TRUE), cases_sum = sum(.x$cases, na.rm = TRUE)), + .window_size = 7 + ) %>% + ungroup() %>% + head(10) ``` +Note that this formula has access to all non-grouping columns present in the +original `epi_df` object and must refer to them with the prefix `.x$...`. As we +can see, the function `epi_slide()` returns an `epi_df` object with a new column +appended that contains the results (from sliding), named `slide_value` as the +default. + Some other information is available in additional variables: * `.group_key` is a one-row tibble containing the values of the grouping variables for the associated group * `.ref_time_value` is the reference time value the time window was based on -Like in `group_modify()`, there are alternative names for these variables as -well: `.` can be used instead of `.x`, `.y` instead of `.group_key`, and `.z` -instead of `.ref_time_value`. - -## Slide with a function - -We can also pass a function for the first argument in `epi_slide()`. In this -case, the passed function must accept the following arguments: - -In this case, the passed function `.f` must accept the following arguments: a -data frame with the same column names as the original object, minus any grouping -variables, containing the time window data for one group-`.ref_time_value` -combination; followed by a one-row tibble containing the values of the grouping -variables for the associated group; followed by the associated `.ref_time_value`. -It can accept additional arguments; `epi_slide()` will forward any `...` args it -receives to `.f`. - -Recreating the last example of a 7-day trailing average: - ```{r} -x <- x %>% +# Returning geo_value in the formula +edf %>% group_by(geo_value) %>% - epi_slide(function(x, gk, rtv) mean(x$cases), .window_size = 7, .new_col_name = "cases_7dav") %>% - ungroup() + epi_slide(~ .x$geo_value[[1]], .window_size = 7) %>% + ungroup() %>% + head(10) -head(x, 10) +# Returning time_value in the formula +edf %>% + group_by(geo_value) %>% + epi_slide(~ .x$time_value[[1]], .window_size = 7) %>% + ungroup() %>% + head(10) ``` +While the computations above do not look very useful, these can be used as +building blocks for computations that do something different depending on the +geo_value or ref_time_value. + ## Slide the tidy way Perhaps the most convenient way to setup a computation in `epi_slide()` is to @@ -154,15 +160,17 @@ to a computation in which we can access any columns of `.x` by name, just as we would in a call to `dplyr::mutate()`, or any of the `dplyr` verbs. For example: ```{r} -x <- x %>% +slide_output <- edf %>% group_by(geo_value) %>% - epi_slide(cases_7dav = mean(cases), .window_size = 7) %>% - ungroup() - -head(x, 10) + epi_slide(cases_7dav = mean(cases, na.rm = TRUE), .window_size = 7) %>% + ungroup() %>% + head(10) ``` -In addition to referring to individual columns by name, you can refer to the -time window data as an `epi_df` or `tibble` using `.x`. Similarly, the other arguments of the function format are available through the magic names `.group_key` and `.ref_time_value`, and the tidyverse "pronouns" `.data` and `.env` can also be used. + +In addition to referring to individual columns by name, you can refer to +`epi_df` time window as `.x` (`.group_key` and `.ref_time_value` are still +available). Also, the tidyverse "pronouns" `.data` and `.env` can also be used +if you need distinguish between the data and environment. As a simple sanity check, we visualize the 7-day trailing averages computed on top of the original counts: @@ -171,7 +179,7 @@ top of the original counts: library(ggplot2) theme_set(theme_bw()) -ggplot(x, aes(x = time_value)) + +ggplot(slide_output, aes(x = time_value)) + geom_col(aes(y = cases, fill = geo_value), alpha = 0.5, show.legend = FALSE) + geom_line(aes(y = cases_7dav, col = geo_value), show.legend = FALSE) + facet_wrap(~geo_value, scales = "free_y") + @@ -182,18 +190,40 @@ ggplot(x, aes(x = time_value)) + As we can see from the top right panel, it looks like Texas moved to weekly reporting of COVID-19 cases in summer of 2021. -## Running a local forecaster +## Slide with a function + +We can also pass a function to the second argument in `epi_slide()`. In this +case, the passed function `.f` must have the form `function(x, g, t, ...)`, +where -As a more complex example, we create a forecaster based on a local (in time) -autoregression or AR model. AR models can be fit in numerous ways (using base R -functions and various packages), but here we define it "by hand" both because it -provides a more advanced example of sliding a function over an `epi_df` object, -and because it allows us to be a bit more flexible in defining a *probabilistic* -forecaster: one that outputs not just a point prediction, but a notion of -uncertainty around this. In particular, our forecaster will output a point -prediction along with an 90\% uncertainty band, represented by a predictive -quantiles at the 5\% and 95\% levels (lower and upper endpoints of the -uncertainty band). +- "x" is an epi_df with the same column names as the archive's `DT`, minus + the `version` column +- "g" is a one-row tibble containing the values of the grouping variables +for the associated group +- "t" is the ref_time_value for the current window +- "..." are additional arguments + +Recreating the last example of a 7-day trailing average: + +```{r} +edf %>% + group_by(geo_value) %>% + epi_slide(function(x, g, t) mean(x$cases, na.rm = TRUE), .window_size = 7) %>% + ungroup() %>% + head(10) +``` + +## Running a simple autoregressive forecaster + +As a more complex example, we create a forecaster based on an autoregression or +AR model. AR models can be fit in numerous ways (using base R functions and +various packages), but here we define it "by hand" both because it provides a +more advanced example of sliding a function over an `epi_df` object, and because +it allows us to be a bit more flexible in defining a *probabilistic* forecaster: +one that outputs not just a point prediction, but a notion of uncertainty around +this. In particular, our forecaster will output a point prediction along with an +90\% uncertainty band, represented by a predictive quantiles at the 5\% and 95\% +levels (lower and upper endpoints of the uncertainty band). The function defined below, `prob_ar()`, is our probabilistic AR forecaster. The `lags`argument indicates which lags to use in the model, and `ahead` indicates @@ -210,6 +240,9 @@ prob_ar <- function(y, lags = c(0, 7, 14), ahead = 6, min_train_window = 20, return(data.frame(point = NA, lower = NA, upper = NA)) } + # Filter down the edge-NAs + y <- y[!is.na(y)] + # Build features and response for the AR model dat <- do.call( data.frame, @@ -246,29 +279,21 @@ scale of smoothed COVID-19 cases. This is clearly equivalent, up to a constant, to modeling weekly sums of COVID-19 cases. ```{r} -fc_time_values <- seq(as.Date("2020-06-01"), - as.Date("2021-12-01"), - by = "1 months" -) -x %>% +fc_time_values <- seq(as.Date("2020-06-01"), as.Date("2021-12-01"), by = "1 months") +edf %>% group_by(geo_value) %>% - epi_slide( - fc = prob_ar(cases_7dav), .window_size = 120, - .ref_time_values = fc_time_values - ) %>% + epi_slide(cases_7dav = mean(.data$cases, na.rm = TRUE), .window_size = 7) %>% + epi_slide(fc = prob_ar(.data$cases_7dav), .window_size = 120, .ref_time_values = fc_time_values) %>% ungroup() %>% head(10) ``` Note that here we have utilized an argument `.ref_time_values` to perform the sliding computation (here, compute a forecast) at a specific subset of reference -time values. We get out a ["packed"][tidyr::pack] data frame column `fc` -containing `fc$point`, `fc$lower`, and `fc$upper` that correspond to the point -forecast, and the lower and upper endpoints of the 95\% prediction band, -respectively. (We could also have used `, prob_ar(cases_7dav)` to get three -separate columns `point`, `lower`, and `upper`, or used `fc = -list(prob_ar(cases_7dav))` to make an `fc` column with a ["nested"][tidyr::nest] -format (list of data frames) instead.) +time values (the start of every month from mid 2020 to the end of 2021). The +resulting epi_df now contains three new columns: `fc$point`, `fc$lower`, and +`fc$upper` corresponding to the point forecast, and the lower and upper +endpoints of the 95\% prediction band, respectively. To finish off, we plot the forecasts at some times (spaced out by a few months) over the last year, at multiple horizons: 7, 14, 21, and 28 days ahead. To do @@ -279,10 +304,13 @@ so that we can call it a few times. # Note the use of .all_rows = TRUE (keeps all original rows in the output) k_week_ahead <- function(x, ahead = 7) { x %>% - group_by(.data$geo_value) %>% + group_by(geo_value) %>% + epi_slide(cases_7dav = mean(.data$cases, na.rm = TRUE), .window_size = 7) %>% epi_slide( fc = prob_ar(.data$cases_7dav, ahead = ahead), - .window_size = 120, .ref_time_values = fc_time_values, .all_rows = TRUE + .window_size = 120, + .ref_time_values = fc_time_values, + .all_rows = TRUE ) %>% ungroup() %>% mutate(target_date = .data$time_value + ahead) @@ -290,10 +318,10 @@ k_week_ahead <- function(x, ahead = 7) { # First generate the forecasts, and bind them together z <- bind_rows( - k_week_ahead(x, ahead = 7), - k_week_ahead(x, ahead = 14), - k_week_ahead(x, ahead = 21), - k_week_ahead(x, ahead = 28) + k_week_ahead(edf, ahead = 7), + k_week_ahead(edf, ahead = 14), + k_week_ahead(edf, ahead = 21), + k_week_ahead(edf, ahead = 28) ) # Now plot them, on top of actual COVID-19 case counts @@ -341,8 +369,10 @@ example in the [archive vignette](https://cmu-delphi.github.io/epiprocess/articles/archive.html). ## Attribution + +The `percent_cli` data is a modified part of the [COVIDcast Epidata API Doctor Visits data](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html). This dataset is licensed under the terms of the [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/). Copyright Delphi Research Group at Carnegie Mellon University 2020. + This document contains a dataset that is a modified part of the [COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University](https://github.com/CSSEGISandData/COVID-19) as [republished in the COVIDcast Epidata API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html). This data set is licensed under the terms of the [Creative Commons Attribution 4.0 International license](https://creativecommons.org/licenses/by/4.0/) by the Johns Hopkins University on behalf of its Center for Systems Science in Engineering. Copyright Johns Hopkins University 2020. [From the COVIDcast Epidata API](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html): - These signals are taken directly from the JHU CSSE [COVID-19 GitHub repository](https://github.com/CSSEGISandData/COVID-19) without changes. - +These signals are taken directly from the JHU CSSE [COVID-19 GitHub repository](https://github.com/CSSEGISandData/COVID-19) without changes. From 187bd5d87eea3a4acc323a715d1ba32edb34cd49 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Thu, 26 Sep 2024 15:12:56 -0700 Subject: [PATCH 110/110] doc: update NEWS --- NEWS.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 5bd2244b..ee04b7f3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -10,7 +10,7 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat - All variables are now dot-prefixed to be more consistent with tidyverse style for functions that allow tidyeval. - The `before/after` arguments have been replaced with the `.window_size` and - `.align` arguments. See documentation for how to translate. + `.align` arguments. - `names_sep` has been removed. If you return data frames from your computations: - without a name, they will be unpacked into separate columns without name @@ -20,7 +20,13 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat - `as_list_col` has been removed. You can now directly return a list from your slide computations instead. If you were using `as_list_col=TRUE`, you will need to wrap your output in a list. + - Ungrouped slides are no longer allowed in `epi_slide`. If you used this for + geographic aggregation up to national, consider using `sum_groups_epi_df`. + - Added `sum_groups_epi_df` to allow aggregation across key columns prior to + sliding. - `epix_slide` interface has major changes. + - All variables are now dot-prefixed to be more consistent with tidyverse + style for functions that allow tidyeval. - `names_sep` has been removed. If you return data frames from your computations: - without a name, they will be unpacked into separate columns without name @@ -30,6 +36,10 @@ Pre-1.0.0 numbering scheme: 0.x will indicate releases, while 0.x.y will indicat - `as_list_col` has been removed. You can now directly return a list from your slide computations instead. If you were using `as_list_col=TRUE`, you will need to wrap your output in a list. +- `as_epi_df()` now checks that every group has unique time values and errors if + this is not the case. The same check is performed at the beginning of + `epi_slide()`. This check is currently not enforced in dplyr operations (like + for joins, mutates, or select), but we plan to add it in the future. - `as_epi_df()` or `as_epi_archive()` no longer accept `additional_metadata`. Use the new `other_keys` arg to specify additional key columns, such as age group columns or other demographic breakdowns. Miscellaneous metadata are no

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�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