Skip to content

Commit a92b053

Browse files
committed
refactor: pull scalar check into validate_slide_window_arg
1 parent 9411375 commit a92b053

File tree

5 files changed

+43
-52
lines changed

5 files changed

+43
-52
lines changed

R/grouped_epi_archive.R

-3
Original file line numberDiff line numberDiff line change
@@ -252,9 +252,6 @@ epix_slide.grouped_epi_archive <- function(
252252
ref_time_values <- sort(ref_time_values)
253253
}
254254

255-
if (!checkmate::test_scalar(before)) {
256-
cli_abort("`before` is a required scalar value.")
257-
}
258255
validate_slide_window_arg(before, guess_time_type(x$private$ungrouped$DT$time_value))
259256

260257
# Symbolize column name

R/slide.R

-8
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,6 @@ epi_slide <- function(x, f, ..., before = NULL, after = NULL, ref_time_values =
154154
}
155155
ref_time_values <- sort(ref_time_values)
156156

157-
# Validate and pre-process `before`, `after`
158-
if (!checkmate::test_scalar(before) || !checkmate::test_scalar(after)) {
159-
cli_abort("Both `before` and `after` are required scalar values.")
160-
}
161157
time_type <- guess_time_type(x$time_value)
162158
validate_slide_window_arg(before, time_type)
163159
validate_slide_window_arg(after, time_type)
@@ -495,10 +491,6 @@ epi_slide_opt <- function(x, col_names, f, ..., before = NULL, after = NULL, ref
495491
}
496492
ref_time_values <- sort(ref_time_values)
497493

498-
# Validate and pre-process `before`, `after`:
499-
if (!checkmate::test_scalar(before) || !checkmate::test_scalar(after)) {
500-
cli_abort("Both `before` and `after` are required scalar values.")
501-
}
502494
time_type <- guess_time_type(x$time_value)
503495
validate_slide_window_arg(before, time_type)
504496
validate_slide_window_arg(after, time_type)

R/utils.R

+14-12
Original file line numberDiff line numberDiff line change
@@ -682,27 +682,29 @@ guess_period <- function(ref_time_values, ref_time_values_arg = rlang::caller_ar
682682

683683

684684
validate_slide_window_arg <- function(arg, time_type, arg_name = rlang::caller_arg(arg)) {
685+
if (is.null(arg)) {
686+
cli_abort("`{arg_name}` is a required argument.")
687+
}
688+
689+
if (!checkmate::test_scalar(arg)) {
690+
cli_abort("Expected `{arg_name}` to be a scalar value.")
691+
}
692+
685693
if (!identical(arg, Inf)) {
686694
if (time_type == "day") {
687-
if (!inherits(arg, "difftime")) {
688-
cli_abort("Expected {arg_name} to be a difftime with units in days.")
689-
}
690-
if (units(arg) != "days") {
691-
cli_abort("Expected {arg_name} to be a difftime with units in days.")
695+
if (!test_int(arg, lower = 0L) && !(inherits(arg, "difftime") && units(arg) == "days")) {
696+
cli_abort("Expected `{arg_name}` to be a difftime with units in days or a non-negative integer.")
692697
}
693698
} else if (time_type == "week") {
694-
if (!inherits(arg, "difftime")) {
695-
cli_abort("Expected {arg_name} to be a difftime with units in weeks.")
696-
}
697-
if (units(arg) != "weeks") {
698-
cli_abort("Expected {arg_name} to be a difftime with units in weeks.")
699+
if (!(inherits(arg, "difftime") && units(arg) == "weeks")) {
700+
cli_abort("Expected `{arg_name}` to be a difftime with units in weeks.")
699701
}
700702
} else if (time_type %in% c("yearweek", "yearmonth", "yearquarter", "year")) {
701703
if (!test_int(arg, lower = 0L) || inherits(arg, "difftime")) {
702-
cli_abort("Expected {arg_name} to be a non-negative integer.")
704+
cli_abort("Expected `{arg_name}` to be a non-negative integer.")
703705
}
704706
} else {
705-
cli_abort("Expected {arg_name} to be Inf, an appropriate a difftime, or an integer.")
707+
cli_abort("Expected `{arg_name}` to be Inf, an appropriate a difftime, or a non-negative integer.")
706708
}
707709
}
708710
}

tests/testthat/test-epi_slide.R

+26-26
Original file line numberDiff line numberDiff line change
@@ -53,47 +53,47 @@ basic_mean_result <- tibble::tribble(
5353
test_that("`before` and `after` are both vectors of length 1", {
5454
expect_error(
5555
epi_slide(grouped, f, before = c(0, 1), after = 0, ref_time_values = test_date + 3),
56-
"Both `before` and `after` are required scalar values."
56+
"Expected `before` to be a scalar value."
5757
)
5858
expect_error(
5959
epi_slide(grouped, f, before = 1, after = c(0, 1), ref_time_values = test_date + 3),
60-
"Both `before` and `after` are required scalar values."
60+
"Expected `after` to be a scalar value."
6161
)
6262
expect_error(
6363
epi_slide_mean(grouped, col_names = value, before = c(0, 1), after = 0, ref_time_values = test_date + 3),
64-
"Both `before` and `after` are required scalar values."
64+
"Expected `before` to be a scalar value."
6565
)
6666
expect_error(
6767
epi_slide_mean(grouped, col_names = value, before = 1, after = c(0, 1), ref_time_values = test_date + 3),
68-
"Both `before` and `after` are required scalar values."
68+
"Expected `after` to be a scalar value."
6969
)
7070
})
7171

7272
test_that("Test errors/warnings for discouraged features", {
7373
expect_error(
7474
epi_slide(grouped, f, ref_time_values = test_date + 1),
75-
"Both `before` and `after` are required scalar values."
75+
"`before` is a required argument."
7676
)
7777
expect_error(
7878
epi_slide(grouped, f, before = 0 * days_dt, ref_time_values = test_date + 1),
79-
"Both `before` and `after` are required scalar values."
79+
"`after` is a required argument."
8080
)
8181
expect_error(
8282
epi_slide(grouped, f, after = 0 * days_dt, ref_time_values = test_date + 1),
83-
"Both `before` and `after` are required scalar values."
83+
"`before` is a required argument."
8484
)
8585

8686
expect_error(
8787
epi_slide_mean(grouped, col_names = value, ref_time_values = test_date + 1),
88-
"Both `before` and `after` are required scalar values."
88+
"`before` is a required argument."
8989
)
9090
expect_error(
9191
epi_slide_mean(grouped, col_names = value, before = 0 * days_dt, ref_time_values = test_date + 1),
92-
"Both `before` and `after` are required scalar values."
92+
"`after` is a required argument."
9393
)
9494
expect_error(
9595
epi_slide_mean(grouped, col_names = value, after = 0 * days_dt, ref_time_values = test_date + 1),
96-
"Both `before` and `after` are required scalar values."
96+
"`before` is a required argument."
9797
)
9898

9999
# Below cases should raise no errors/warnings:
@@ -135,64 +135,64 @@ test_that("Test errors/warnings for discouraged features", {
135135
test_that("Both `before` and `after` must be non-NA, non-negative, integer-compatible", {
136136
expect_error(
137137
epi_slide(grouped, f, before = -1L, after = 0 * days_dt, ref_time_values = test_date + 2L),
138-
"Expected before to be a difftime with units in days."
138+
"Expected `before` to be a difftime with units in days or a non-negative integer."
139139
)
140140
expect_error(
141141
epi_slide(grouped, f, before = 0 * days_dt, after = -1L, ref_time_values = test_date + 2L),
142-
"Expected after to be a difftime with units in days."
142+
"Expected `after` to be a difftime with units in days or a non-negative integer."
143143
)
144144
expect_error(epi_slide(grouped, f, before = "a", after = days_dt, ref_time_values = test_date + 2L),
145-
regexp = "Expected before to be a difftime with units in days."
145+
regexp = "Expected `before` to be a difftime with units in days or a non-negative integer."
146146
)
147147
expect_error(epi_slide(grouped, f, before = days_dt, after = "a", ref_time_values = test_date + 2L),
148-
regexp = "Expected after to be a difftime with units in days."
148+
regexp = "Expected `after` to be a difftime with units in days or a non-negative integer."
149149
)
150150
expect_error(epi_slide(grouped, f, before = 0.5, after = days_dt, ref_time_values = test_date + 2L),
151-
regexp = "Expected before to be a difftime with units in days."
151+
regexp = "Expected `before` to be a difftime with units in days or a non-negative integer."
152152
)
153153
expect_error(epi_slide(grouped, f, before = days_dt, after = 0.5, ref_time_values = test_date + 2L),
154-
regexp = "Expected after to be a difftime with units in days."
154+
regexp = "Expected `after` to be a difftime with units in days or a non-negative integer."
155155
)
156156
expect_error(
157157
epi_slide(grouped, f, before = NA, after = 1L, ref_time_values = test_date + 2L),
158-
"Both `before` and `after` are required scalar values."
158+
"Expected `before` to be a scalar value."
159159
)
160160
expect_error(
161161
epi_slide(grouped, f, before = days_dt, after = NA, ref_time_values = test_date + 2L),
162-
"Both `before` and `after` are required scalar values."
162+
"Expected `after` to be a scalar value."
163163
)
164164

165165
expect_error(
166166
epi_slide_mean(grouped, col_names = value, before = -1L, after = 0 * days_dt, ref_time_values = test_date + 2L),
167-
"Expected before to be a difftime with units in days."
167+
"Expected `before` to be a difftime with units in days or a non-negative integer."
168168
)
169169
expect_error(
170170
epi_slide_mean(grouped, col_names = value, before = 0 * days_dt, after = -1L, ref_time_values = test_date + 2L),
171-
"Expected after to be a difftime with units in days."
171+
"Expected `after` to be a difftime with units in days or a non-negative integer."
172172
)
173173
expect_error(
174174
epi_slide_mean(grouped, col_names = value, before = "a", after = 0 * days_dt, ref_time_values = test_date + 2L),
175-
regexp = "Expected before to be a difftime with units in days."
175+
regexp = "Expected `before` to be a difftime with units in days or a non-negative integer."
176176
)
177177
expect_error(
178178
epi_slide_mean(grouped, col_names = value, before = 0 * days_dt, after = "a", ref_time_values = test_date + 2L),
179-
regexp = "Expected after to be a difftime with units in days."
179+
regexp = "Expected `after` to be a difftime with units in days or a non-negative integer."
180180
)
181181
expect_error(
182182
epi_slide_mean(grouped, col_names = value, before = 0.5, after = 0 * days_dt, ref_time_values = test_date + 2L),
183-
regexp = "Expected before to be a difftime with units in days."
183+
regexp = "Expected `before` to be a difftime with units in days or a non-negative integer."
184184
)
185185
expect_error(
186186
epi_slide_mean(grouped, col_names = value, before = 0 * days_dt, after = 0.5, ref_time_values = test_date + 2L),
187-
regexp = "Expected after to be a difftime with units in days."
187+
regexp = "Expected `after` to be a difftime with units in days or a non-negative integer."
188188
)
189189
expect_error(
190190
epi_slide_mean(grouped, col_names = value, before = NA, after = days_dt, ref_time_values = test_date + 2L),
191-
"Both `before` and `after` are required scalar values."
191+
"Expected `before` to be a scalar value."
192192
)
193193
expect_error(
194194
epi_slide_mean(grouped, col_names = value, before = days_dt, after = NA, ref_time_values = test_date + 2L),
195-
"Both `before` and `after` are required scalar values."
195+
"Expected `after` to be a scalar value."
196196
)
197197

198198
# Non-integer-class but integer-compatible values are allowed:

tests/testthat/test-epix_slide.R

+3-3
Original file line numberDiff line numberDiff line change
@@ -178,15 +178,15 @@ test_that("epix_slide works as intended with `as_list_col=TRUE`", {
178178
test_that("epix_slide `before` validation works", {
179179
expect_error(
180180
xx %>% epix_slide(f = ~ sum(.x$binary), before = NA),
181-
"`before` is a required scalar value."
181+
"Expected `before` to be a scalar value."
182182
)
183183
expect_error(
184184
xx %>% epix_slide(f = ~ sum(.x$binary), before = -1),
185-
"Expected before to be a difftime with units in days."
185+
"Expected `before` to be a difftime with units in days or a non-negative integer."
186186
)
187187
expect_error(
188188
xx %>% epix_slide(f = ~ sum(.x$binary), before = 1.5),
189-
"Expected before to be a difftime with units in days."
189+
"Expected `before` to be a difftime with units in days or a non-negative integer."
190190
)
191191
# These `before` values should be accepted:
192192
expect_error(

0 commit comments

Comments
 (0)