Skip to content

Commit 80d787b

Browse files
committed
fix(filter.epi_archive): for+lazy, left-behind bindings
1 parent 17a369c commit 80d787b

File tree

3 files changed

+62
-7
lines changed

3 files changed

+62
-7
lines changed

R/methods-epi_archive.R

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,16 +1069,24 @@ filter.epi_archive <- function(.data, ..., .by = NULL, .format_aware = FALSE) {
10691069
">" = "If not, see `?filter.epi_archive` details for how to proceed."
10701070
), class = "epiprocess__filter_archive__used_version"), assign.env = e)
10711071
for (measurement_colname in measurement_colnames) {
1072-
delayedAssign(measurement_colname, cli::cli_abort(c(
1073-
"Using `{format_varname(measurement_colname)}`
1074-
in `filter.epi_archive` may produce unexpected results.",
1075-
">" = "See `?filter.epi_archive` details for how to proceed."
1076-
), class = "epiprocess__filter_archive__used_measurement"), assign.env = e)
1072+
# Record current `measurement_colname` and set up delayed
1073+
# binding for error in a child environment, so that `for` loop
1074+
# updating its value and `rm` cleanup don't mess things up:
1075+
local({
1076+
local_measurement_colname <- measurement_colname
1077+
delayedAssign(measurement_colname, cli::cli_abort(c(
1078+
"Using `{format_varname(local_measurement_colname)}`
1079+
in `filter.epi_archive` may produce unexpected results.",
1080+
">" = "See `?filter.epi_archive` details for how to proceed."
1081+
), class = "epiprocess__filter_archive__used_measurement"), assign.env = e)
1082+
})
10771083
}
10781084
break
10791085
}
10801086
e <- parent.env(e)
10811087
}
1088+
# Don't mask similarly-named user objects:
1089+
rm(list = c("e", "measurement_colname"))
10821090
TRUE
10831091
},
10841092
...,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# filter.epi_archive works as expected
2+
3+
Code
4+
ea2 %>% filter(version <= as.Date("2020-06-02"))
5+
Condition <rlang_error>
6+
Error in `filter()`:
7+
i In argument: `version <= as.Date("2020-06-02")`.
8+
Caused by error:
9+
! Using `version` in `filter.epi_archive` may produce unexpected results.
10+
> See if `epix_as_of` or `epix_slide` would work instead.
11+
> If not, see `?filter.epi_archive` details for how to proceed.
12+
13+
---
14+
15+
Code
16+
ea2 %>% filter(time_value >= as.Date("2020-06-02"), cases >= 2L)
17+
Condition <rlang_error>
18+
Error in `filter()`:
19+
i In argument: `cases >= 2L`.
20+
Caused by error:
21+
! Using `cases` in `filter.epi_archive` may produce unexpected results.
22+
> See `?filter.epi_archive` details for how to proceed.
23+
24+
---
25+
26+
Code
27+
ea2p %>% filter(cases >= median(cases), .by = geo_value)
28+
Condition <rlang_error>
29+
Error in `filter()`:
30+
i In argument: `cases >= median(cases)`.
31+
i In group 1: `geo_value = "ca"`.
32+
Caused by error:
33+
! Using `cases` in `filter.epi_archive` may produce unexpected results.
34+
> See `?filter.epi_archive` details for how to proceed.
35+

tests/testthat/test-methods-epi_archive.R

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,11 @@ test_that("filter.epi_archive works as expected", {
191191

192192
# Environment variables should be fine:
193193
version <- as.Date("2020-06-02") + 1
194-
expect_no_error(ea2 %>% filter(geo_value == "ca", .env$version <= time_value))
194+
e <- version
195+
expected <- ea2 %>% filter(geo_value == "ca", as.Date("2020-06-02") + 1 <= time_value)
196+
expect_equal(ea2 %>% filter(geo_value == "ca", .env$version <= time_value), expected)
197+
expect_equal(ea2 %>% filter(geo_value == "ca", e <= time_value), expected)
198+
expect_equal(ea2 %>% filter(geo_value == "ca", .env$e <= time_value), expected)
195199

196200
# Error-raising:
197201
expect_error(
@@ -218,10 +222,18 @@ test_that("filter.epi_archive works as expected", {
218222
ea2 %>% filter(time_value >= as.Date("2020-06-02"), cases >= 2L),
219223
class = "epiprocess__filter_archive__used_measurement"
220224
)
225+
ea2p <- ea2_data %>%
226+
# to check for `for` + `delayedAssign` mishap in expect_snapshot
227+
mutate(deaths = 0) %>%
228+
as_epi_archive()
221229
expect_error(
222-
ea2 %>% filter(cases >= median(cases), .by = geo_value),
230+
ea2p %>% filter(cases >= median(cases), .by = geo_value),
223231
class = "epiprocess__filter_archive__used_measurement"
224232
)
233+
expect_snapshot(
234+
ea2p %>% filter(cases >= median(cases), .by = geo_value),
235+
error = TRUE, cnd_class = TRUE
236+
)
225237

226238
# Escape hatch:
227239
expect_equal(

0 commit comments

Comments
 (0)