diff --git a/NAMESPACE b/NAMESPACE index 4c55f995..774a343b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -23,6 +23,7 @@ S3method(group_modify,duckplyr_df) S3method(group_nest,duckplyr_df) S3method(group_size,duckplyr_df) S3method(group_split,duckplyr_df) +S3method(group_trim,duckplyr_df) S3method(group_vars,duckplyr_df) S3method(groups,duckplyr_df) S3method(head,duckplyr_df) @@ -263,6 +264,7 @@ importFrom(dplyr,group_nest) importFrom(dplyr,group_rows) importFrom(dplyr,group_size) importFrom(dplyr,group_split) +importFrom(dplyr,group_trim) importFrom(dplyr,group_vars) importFrom(dplyr,group_walk) importFrom(dplyr,grouped_df) diff --git a/R/duckplyr-package.R b/R/duckplyr-package.R index f7487920..62a1ea25 100644 --- a/R/duckplyr-package.R +++ b/R/duckplyr-package.R @@ -12,6 +12,7 @@ #' @importFrom dplyr group_indices #' @importFrom dplyr group_nest #' @importFrom dplyr group_split +#' @importFrom dplyr group_trim #' @importFrom dplyr grouped_df #' @importFrom dplyr if_else #' @importFrom glue glue diff --git a/R/group_trim.R b/R/group_trim.R new file mode 100644 index 00000000..b8c62c28 --- /dev/null +++ b/R/group_trim.R @@ -0,0 +1,32 @@ +# Generated by 02-duckplyr_df-methods.R +#' @export +group_trim.duckplyr_df <- function(.tbl, .drop = group_by_drop_default(.tbl)) { + # Our implementation + rel_try( + # Always fall back to dplyr + "No relational implementation for group_trim()" = TRUE, + { + return(out) + } + ) + + # dplyr forward + group_trim <- dplyr$group_trim.data.frame + out <- group_trim(.tbl, .drop) + return(out) + + # dplyr implementation + .tbl +} + +duckplyr_group_trim <- function(.tbl, ...) { + try_fetch( + .tbl <- as_duckplyr_df(.tbl), + error = function(e) { + testthat::skip(conditionMessage(e)) + } + ) + out <- group_trim(.tbl, ...) + class(out) <- setdiff(class(out), "duckplyr_df") + out +} diff --git a/R/overwrite.R b/R/overwrite.R index 9c57d048..b75fe840 100644 --- a/R/overwrite.R +++ b/R/overwrite.R @@ -23,6 +23,7 @@ methods_overwrite <- function() { vctrs::s3_register("dplyr::group_nest", "data.frame", group_nest.duckplyr_df) vctrs::s3_register("dplyr::group_size", "data.frame", group_size.duckplyr_df) vctrs::s3_register("dplyr::group_split", "data.frame", group_split.duckplyr_df) + vctrs::s3_register("dplyr::group_trim", "data.frame", group_trim.duckplyr_df) vctrs::s3_register("dplyr::group_vars", "data.frame", group_vars.duckplyr_df) vctrs::s3_register("dplyr::groups", "data.frame", groups.duckplyr_df) vctrs::s3_register("dplyr::inner_join", "data.frame", inner_join.duckplyr_df) diff --git a/R/restore.R b/R/restore.R index 75d5ac09..8640755b 100644 --- a/R/restore.R +++ b/R/restore.R @@ -23,6 +23,7 @@ methods_restore <- function() { vctrs::s3_register("dplyr::group_nest", "data.frame", dplyr$group_nest.data.frame) vctrs::s3_register("dplyr::group_size", "data.frame", dplyr$group_size.data.frame) vctrs::s3_register("dplyr::group_split", "data.frame", dplyr$group_split.data.frame) + vctrs::s3_register("dplyr::group_trim", "data.frame", dplyr$group_trim.data.frame) vctrs::s3_register("dplyr::group_vars", "data.frame", dplyr$group_vars.data.frame) vctrs::s3_register("dplyr::groups", "data.frame", dplyr$groups.data.frame) vctrs::s3_register("dplyr::inner_join", "data.frame", dplyr$inner_join.data.frame) diff --git a/dplyr-methods/group_trim.txt b/dplyr-methods/group_trim.txt new file mode 100644 index 00000000..74d08fe9 --- /dev/null +++ b/dplyr-methods/group_trim.txt @@ -0,0 +1,3 @@ +group_trim.data.frame <- function(.tbl, .drop = group_by_drop_default(.tbl)) { + .tbl +} diff --git a/tests/testthat/test-as_duckplyr_df.R b/tests/testthat/test-as_duckplyr_df.R index 966324a6..d764303e 100644 --- a/tests/testthat/test-as_duckplyr_df.R +++ b/tests/testthat/test-as_duckplyr_df.R @@ -882,6 +882,22 @@ test_that("as_duckplyr_df() and group_split()", { expect_equal(pre, post) }) +test_that("as_duckplyr_df() and group_trim()", { + withr::local_envvar(DUCKPLYR_FORCE = "FALSE") + + skip("Grouped") + + # Data + test_df <- data.frame(a = 1:6 + 0, b = 2, g = rep(1:3, 1:3)) + + # Run + pre <- test_df %>% as_duckplyr_df() %>% group_trim() + post <- test_df %>% group_trim() %>% as_duckplyr_df() + + # Compare + expect_equal(pre, post) +}) + test_that("as_duckplyr_df() and group_vars()", { withr::local_envvar(DUCKPLYR_FALLBACK_FORCE = "TRUE") diff --git a/tools/00-funs.R b/tools/00-funs.R index 4cc10c59..49eb3c59 100644 --- a/tools/00-funs.R +++ b/tools/00-funs.R @@ -16,7 +16,7 @@ df_methods <- filter(!grepl("_$|^as[.]tbl$", name)) %>% # special dplyr methods, won't implement filter(!(name %in% c( - "group_trim", "n_groups", + "n_groups", "same_src", # data frames can be copied into duck-frames with zero cost NULL ))) %>% @@ -33,6 +33,7 @@ df_methods <- "group_nest", "group_size", "group_split", + "group_trim", "groups", "rowwise", NULL