Skip to content

Commit e6f7264

Browse files
committed
feat(epi_slide_opt): adjust [.]new_col_name = error guidance
1 parent b4d71dc commit e6f7264

File tree

4 files changed

+134
-7
lines changed

4 files changed

+134
-7
lines changed

R/slide.R

+6-5
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ epi_slide_opt <- function(
646646
if ("new_col_name" %in% provided_args || ".new_col_name" %in% provided_args) {
647647
cli::cli_abort(
648648
"epi_slide_opt: the argument `new_col_name` is not supported for `epi_slide_opt`. If you want to customize
649-
the output column names, use `dplyr::rename` after the slide.",
649+
the output column names, use `.prefix =`, `.suffix =`, or `.new_col_**names** =`.",
650650
class = "epiprocess__epi_slide_opt__new_name_not_supported"
651651
)
652652
}
@@ -746,14 +746,15 @@ epi_slide_opt <- function(
746746
window_args <- get_before_after_from_window(.window_size, .align, time_type)
747747

748748
# Handle output naming
749-
assert_string(.prefix, null.ok = TRUE)
750-
assert_string(.suffix, null.ok = TRUE)
751-
assert_character(.new_col_names, len = length(col_names_chr), null.ok = TRUE)
752749
if ((!is.null(.prefix) || !is.null(.suffix)) && !is.null(.new_col_names)) {
753750
cli_abort(
754-
"Can't use both .prefix/.suffix and .new_col_names at the same time."
751+
"Can't use both .prefix/.suffix and .new_col_names at the same time.",
752+
class = "epiprocess__epi_slide_opt_incompatible_naming_args"
755753
)
756754
}
755+
assert_string(.prefix, null.ok = TRUE)
756+
assert_string(.suffix, null.ok = TRUE)
757+
assert_character(.new_col_names, len = length(col_names_chr), null.ok = TRUE)
757758
if (is.null(.prefix) && is.null(.suffix) && is.null(.new_col_names)) {
758759
.suffix <- "_{.n}{.time_unit_abbr}{.align_abbr}{.f_abbr}"
759760
# ^ does not account for any arguments specified to underlying functions via

R/utils.R

+2-2
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,7 @@ time_delta_to_n_steps <- function(time_delta, time_type) {
11371137
week = "weeks",
11381138
cli_abort("difftime objects not supported for time_type {format_chr_with_quotes(time_type)}")
11391139
)
1140-
units(time_delta) <- output_units # converts number accordingly, doesn't just set attr
1140+
units(time_delta) <- output_units # converts number to represent same duration; not just attr<-
11411141
n_steps <- vec_data(time_delta)
11421142
if (!is_bare_integerish(n_steps)) {
11431143
cli_abort("`time_delta` did not appear to contain only integerish numbers
@@ -1164,7 +1164,7 @@ time_delta_to_n_steps <- function(time_delta, time_type) {
11641164
time_type_unit_abbrs <- c(
11651165
day = "d",
11661166
week = "w",
1167-
yearmon = "m"
1167+
yearmonth = "m"
11681168
)
11691169

11701170
time_type_unit_abbr <- function(time_type) {

man/time_delta_to_n_steps.Rd

+31
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-epi_slide.R

+95
Original file line numberDiff line numberDiff line change
@@ -755,3 +755,98 @@ test_that("no dplyr warnings from selecting multiple columns", {
755755
)
756756
expect_equal(multi_slid_select, multi_slid)
757757
})
758+
759+
test_that("epi_slide_opt output naming features", {
760+
multi_columns <- dplyr::bind_rows(
761+
dplyr::tibble(geo_value = "ak", time_value = test_date + 1:200, value = 1:200, value2 = -1:-200),
762+
dplyr::tibble(geo_value = "al", time_value = test_date + 1:5, value = -(1:5), value2 = 1:5)
763+
) %>%
764+
as_epi_df() %>%
765+
group_by(geo_value)
766+
multi_columns_weekly <- dplyr::bind_rows(
767+
dplyr::tibble(geo_value = "ak", time_value = test_date + 7 * (1:200), value = 1:200, value2 = -1:-200),
768+
dplyr::tibble(geo_value = "al", time_value = test_date + 7 * (1:5), value = -(1:5), value2 = 1:5)
769+
) %>%
770+
as_epi_df() %>%
771+
group_by(geo_value)
772+
yearmonthly <-
773+
tibble::tibble(
774+
geo_value = 1,
775+
time_value = tsibble::make_yearmonth(2000, 1) + 1:30 - 1,
776+
value = 1:30 %% 2 == 0
777+
) %>%
778+
as_epi_df() %>%
779+
group_by(geo_value)
780+
781+
# Auto-naming:
782+
# * Changing .f and .window_size:
783+
expect_equal(
784+
multi_columns %>% epi_slide_opt(value2, frollmean, .window_size = 14) %>% names(),
785+
c(names(multi_columns), "value2_14dav")
786+
)
787+
expect_equal(
788+
multi_columns %>% epi_slide_opt(value2, slide_mean, .window_size = as.difftime(14, units = "days")) %>% names(),
789+
c(names(multi_columns), "value2_14dav")
790+
)
791+
expect_equal(
792+
multi_columns %>% epi_slide_opt(value2, slide_sum, .window_size = Inf) %>% names(),
793+
c(names(multi_columns), "value2_running_sum")
794+
)
795+
# * Changing .f and .align:
796+
expect_equal(
797+
multi_columns %>% epi_slide_opt(value2, slide_min, .window_size = 14, .align = "center") %>% names(),
798+
c(names(multi_columns), "value2_14dcmin")
799+
)
800+
expect_equal(
801+
multi_columns %>% epi_slide_opt(value2, slide_max, .window_size = 14, .align = "left") %>% names(),
802+
c(names(multi_columns), "value2_14dlmax")
803+
)
804+
# * Changing .f, time_type(, .window_size):
805+
expect_equal(
806+
multi_columns_weekly %>% epi_slide_opt(value2, slide_prod, .window_size = as.difftime(2, units = "weeks")) %>% names(),
807+
c(names(multi_columns_weekly), "value2_2wprod")
808+
)
809+
expect_equal(
810+
yearmonthly %>% epi_slide_opt(value, slide_any, .window_size = 3) %>% names(),
811+
c(names(yearmonthly), "value_3many") # not the best name, but super unlikely anyway
812+
)
813+
814+
# Manual naming:
815+
expect_equal(
816+
multi_columns %>% epi_slide_opt(starts_with("value"), slide_sum, .window_size = 7, .suffix = "_s{.n}") %>% names(),
817+
c(names(multi_columns), "value_s7", "value2_s7")
818+
)
819+
expect_equal(
820+
multi_columns %>% epi_slide_opt(starts_with("value"), slide_sum, .window_size = 7, .prefix = "{.f_abbr}_", .suffix = "_{.n}") %>% names(),
821+
c(names(multi_columns), "sum_value_7", "sum_value2_7")
822+
)
823+
expect_equal(
824+
multi_columns %>% epi_slide_opt(starts_with("value"), slide_sum, .window_size = 7, .prefix = "slide_value_") %>% names(),
825+
c(names(multi_columns), "slide_value_value", "slide_value_value2")
826+
)
827+
expect_equal(
828+
multi_columns %>% epi_slide_opt(starts_with("value"), slide_sum, .window_size = 7, .new_col_names = c("slide_value", "sv2")) %>% names(),
829+
c(names(multi_columns), "slide_value", "sv2")
830+
)
831+
832+
# Validation errors:
833+
expect_error(
834+
multi_columns %>% epi_slide_opt(starts_with("value"), slide_sum,
835+
.window_size = 7,
836+
.suffix = c("a", "b")
837+
)
838+
)
839+
expect_error(
840+
multi_columns %>% epi_slide_opt(starts_with("value"), slide_sum,
841+
.window_size = 7,
842+
.new_col_names = "slide_value"
843+
)
844+
)
845+
expect_error(
846+
multi_columns %>% epi_slide_opt(value, slide_sum,
847+
.window_size = 7,
848+
.prefix = "a", .suffix = "b", .new_col_names = "slide_value"
849+
),
850+
class = "epiprocess__epi_slide_opt_incompatible_naming_args"
851+
)
852+
})

0 commit comments

Comments
 (0)