diff --git a/NAMESPACE b/NAMESPACE index 00c86d39..4c55f995 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -22,6 +22,7 @@ S3method(group_map,duckplyr_df) S3method(group_modify,duckplyr_df) S3method(group_nest,duckplyr_df) S3method(group_size,duckplyr_df) +S3method(group_split,duckplyr_df) S3method(group_vars,duckplyr_df) S3method(groups,duckplyr_df) S3method(head,duckplyr_df) diff --git a/R/group_split.R b/R/group_split.R new file mode 100644 index 00000000..a3e3dd3f --- /dev/null +++ b/R/group_split.R @@ -0,0 +1,37 @@ +# Generated by 02-duckplyr_df-methods.R +#' @export +group_split.duckplyr_df <- function(.tbl, ..., .keep = TRUE, keep = deprecated()) { + # Our implementation + rel_try( + # Always fall back to dplyr + "No relational implementation for group_split()" = TRUE, + { + return(out) + } + ) + + # dplyr forward + group_split <- dplyr$group_split.data.frame + out <- group_split(.tbl, ..., .keep = .keep, keep = keep) + return(out) + + # dplyr implementation + if (!missing(keep)) { + lifecycle::deprecate_warn("1.0.0", "group_split(keep = )", "group_split(.keep = )", always = TRUE) + .keep <- keep + } + data <- group_by(.tbl, ...) + group_split_impl(data, .keep = .keep) +} + +duckplyr_group_split <- function(.tbl, ...) { + try_fetch( + .tbl <- as_duckplyr_df(.tbl), + error = function(e) { + testthat::skip(conditionMessage(e)) + } + ) + out <- group_split(.tbl, ...) + class(out) <- setdiff(class(out), "duckplyr_df") + out +} diff --git a/R/overwrite.R b/R/overwrite.R index 79f78303..9c57d048 100644 --- a/R/overwrite.R +++ b/R/overwrite.R @@ -22,6 +22,7 @@ methods_overwrite <- function() { vctrs::s3_register("dplyr::group_modify", "data.frame", group_modify.duckplyr_df) 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_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 e9bf9e92..75d5ac09 100644 --- a/R/restore.R +++ b/R/restore.R @@ -22,6 +22,7 @@ methods_restore <- function() { vctrs::s3_register("dplyr::group_modify", "data.frame", dplyr$group_modify.data.frame) 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_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_split.txt b/dplyr-methods/group_split.txt new file mode 100644 index 00000000..4510ec82 --- /dev/null +++ b/dplyr-methods/group_split.txt @@ -0,0 +1,8 @@ +group_split.data.frame <- function(.tbl, ..., .keep = TRUE, keep = deprecated()) { + if (!missing(keep)) { + lifecycle::deprecate_warn("1.0.0", "group_split(keep = )", "group_split(.keep = )", always = TRUE) + .keep <- keep + } + data <- group_by(.tbl, ...) + group_split_impl(data, .keep = .keep) +} diff --git a/tests/testthat/test-as_duckplyr_df.R b/tests/testthat/test-as_duckplyr_df.R index f3143d71..966324a6 100644 --- a/tests/testthat/test-as_duckplyr_df.R +++ b/tests/testthat/test-as_duckplyr_df.R @@ -866,6 +866,22 @@ test_that("as_duckplyr_df() and group_size()", { expect_equal(pre, post) }) +test_that("as_duckplyr_df() and group_split()", { + withr::local_envvar(DUCKPLYR_FORCE = "FALSE") + + skip("WAT") + + # 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_split() + post <- test_df %>% group_split() %>% 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 938f18c5..4cc10c59 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_split", "group_trim", "n_groups", + "group_trim", "n_groups", "same_src", # data frames can be copied into duck-frames with zero cost NULL ))) %>% @@ -32,6 +32,7 @@ df_methods <- "group_modify", "group_nest", "group_size", + "group_split", "groups", "rowwise", NULL