diff --git a/R/get_datagrid.R b/R/get_datagrid.R index 855ed625f..b705e3db0 100644 --- a/R/get_datagrid.R +++ b/R/get_datagrid.R @@ -747,6 +747,13 @@ get_datagrid.default <- function( # check for interactions in "by" by <- .extract_at_interactions(by) + by_stripped <- vapply( + by, + function(by_var) { + .get_datagrid_clean_target(by_var, x = data, digits = digits)$varname + }, + character(1) + ) # Drop random factors random_factors <- find_random(x, flatten = TRUE, split_nested = TRUE) @@ -756,8 +763,8 @@ get_datagrid.default <- function( keep <- c(find_predictors(x, effects = "fixed", flatten = TRUE), response) if (!is.null(keep)) { if (all(by != "all")) { - keep <- c(keep, by[by %in% random_factors]) - random_factors <- setdiff(random_factors, by) + keep <- c(keep, by_stripped[by_stripped %in% random_factors]) + random_factors <- setdiff(random_factors, by_stripped) } data <- data[colnames(data) %in% keep] } diff --git a/tests/testthat/test-get_datagrid.R b/tests/testthat/test-get_datagrid.R index 81b8c3109..0fb0ed881 100644 --- a/tests/testthat/test-get_datagrid.R +++ b/tests/testthat/test-get_datagrid.R @@ -822,6 +822,30 @@ test_that("get_datagrid - include_random works with numeric group factors", { expect_identical(out$cyl, c(NA, NA)) }) +test_that("get_datagrid - by with tokened random effect", { + skip_if_not_installed("glmmTMB") + + data(mtcars) + mtcars$vs <- as.factor(mtcars$vs) + model <- glmmTMB::glmmTMB( + mpg ~ vs + (1 | cyl), + data = mtcars + ) + out <- get_datagrid( + model, + by = c("vs", "cyl = [minmax]") + ) + + expect_identical( + out$vs, + structure(c(1L, 1L, 2L), levels = c("0", "1"), class = "factor") + ) + expect_identical( + out$cyl, + c(4, 8, 4) + ) +}) + test_that("get_datagrid - include_random works with interacting random effects", { skip_if_not_installed("glmmTMB")