Skip to content

Commit

Permalink
group_nest
Browse files Browse the repository at this point in the history
  • Loading branch information
krlmlr committed Mar 7, 2024
1 parent 2630364 commit 627aafd
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 1 deletion.
2 changes: 2 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ S3method(group_indices,duckplyr_df)
S3method(group_keys,duckplyr_df)
S3method(group_map,duckplyr_df)
S3method(group_modify,duckplyr_df)
S3method(group_nest,duckplyr_df)
S3method(group_size,duckplyr_df)
S3method(group_vars,duckplyr_df)
S3method(groups,duckplyr_df)
Expand Down Expand Up @@ -257,6 +258,7 @@ importFrom(dplyr,group_indices)
importFrom(dplyr,group_keys)
importFrom(dplyr,group_map)
importFrom(dplyr,group_modify)
importFrom(dplyr,group_nest)
importFrom(dplyr,group_rows)
importFrom(dplyr,group_size)
importFrom(dplyr,group_split)
Expand Down
1 change: 1 addition & 0 deletions R/duckplyr-package.R
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#' @importFrom collections queue
#' @importFrom dplyr group_by_prepare
#' @importFrom dplyr group_indices
#' @importFrom dplyr group_nest
#' @importFrom dplyr group_split
#' @importFrom dplyr grouped_df
#' @importFrom dplyr if_else
Expand Down
36 changes: 36 additions & 0 deletions R/group_nest.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by 02-duckplyr_df-methods.R
#' @export
group_nest.duckplyr_df <- function(.tbl, ..., .key = "data", keep = FALSE) {
# Our implementation
rel_try(
# Always fall back to dplyr
"No relational implementation for group_nest()" = TRUE,
{
return(out)
}
)

# dplyr forward
group_nest <- dplyr$group_nest.data.frame
out <- group_nest(.tbl, ..., .key = .key, keep = keep)
return(out)

# dplyr implementation
if (dots_n(...)) {
group_nest_impl(group_by(.tbl, ...), .key = .key, keep = keep)
} else {
tibble(!!.key := list(.tbl))
}
}

duckplyr_group_nest <- function(.tbl, ...) {
try_fetch(
.tbl <- as_duckplyr_df(.tbl),
error = function(e) {
testthat::skip(conditionMessage(e))
}
)
out <- group_nest(.tbl, ...)
class(out) <- setdiff(class(out), "duckplyr_df")
out
}
1 change: 1 addition & 0 deletions R/overwrite.R
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ methods_overwrite <- function() {
vctrs::s3_register("dplyr::group_keys", "data.frame", group_keys.duckplyr_df)
vctrs::s3_register("dplyr::group_map", "data.frame", group_map.duckplyr_df)
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_vars", "data.frame", group_vars.duckplyr_df)
vctrs::s3_register("dplyr::groups", "data.frame", groups.duckplyr_df)
Expand Down
1 change: 1 addition & 0 deletions R/restore.R
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ methods_restore <- function() {
vctrs::s3_register("dplyr::group_keys", "data.frame", dplyr$group_keys.data.frame)
vctrs::s3_register("dplyr::group_map", "data.frame", dplyr$group_map.data.frame)
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_vars", "data.frame", dplyr$group_vars.data.frame)
vctrs::s3_register("dplyr::groups", "data.frame", dplyr$groups.data.frame)
Expand Down
7 changes: 7 additions & 0 deletions dplyr-methods/group_nest.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
group_nest.data.frame <- function(.tbl, ..., .key = "data", keep = FALSE) {
if (dots_n(...)) {
group_nest_impl(group_by(.tbl, ...), .key = .key, keep = keep)
} else {
tibble(!!.key := list(.tbl))
}
}
16 changes: 16 additions & 0 deletions tests/testthat/test-as_duckplyr_df.R
Original file line number Diff line number Diff line change
Expand Up @@ -834,6 +834,22 @@ test_that("as_duckplyr_df() and group_modify(~ .x)", {
expect_equal(pre, post)
})

test_that("as_duckplyr_df() and group_nest()", {
withr::local_envvar(DUCKPLYR_FORCE = "FALSE")

skip("Always returns tibble")

# 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_nest()
post <- test_df %>% group_nest() %>% as_duckplyr_df()

# Compare
expect_equal(pre, post)
})

test_that("as_duckplyr_df() and group_size()", {
withr::local_envvar(DUCKPLYR_FORCE = "FALSE")

Expand Down
3 changes: 2 additions & 1 deletion tools/00-funs.R
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ df_methods <-
filter(!grepl("_$|^as[.]tbl$", name)) %>%
# special dplyr methods, won't implement
filter(!(name %in% c(
"group_nest", "group_split", "group_trim", "n_groups",
"group_split", "group_trim", "n_groups",
"same_src", # data frames can be copied into duck-frames with zero cost
NULL
))) %>%
Expand All @@ -30,6 +30,7 @@ df_methods <-
"group_keys",
"group_map",
"group_modify",
"group_nest",
"group_size",
"groups",
"rowwise",
Expand Down

0 comments on commit 627aafd

Please sign in to comment.