diff --git a/DESCRIPTION b/DESCRIPTION index 0535f3a..ec72e40 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: maditr Type: Package Title: Fast Data Aggregation, Modification, and Filtering with Pipes and 'data.table' -Version: 0.8.2 +Version: 0.8.3 Maintainer: Gregory Demin Authors@R: person("Gregory", "Demin", email = "gdemin@gmail.com", role = c("aut", "cre")) Depends: R (>= 3.3.0) @@ -18,5 +18,5 @@ URL: https://github.com/gdemin/maditr BugReports: https://github.com/gdemin/maditr/issues VignetteBuilder: knitr Encoding: UTF-8 -RoxygenNote: 7.1.1 +RoxygenNote: 7.1.2 Roxygen: list(markdown = TRUE) diff --git a/NAMESPACE b/NAMESPACE index 6f24b3b..18e1f74 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -15,6 +15,7 @@ S3method(query,data.frame) S3method(query_if,data.frame) S3method(rollup,data.frame) S3method(rows,data.frame) +S3method(rows,etable) S3method(sort_by,data.frame) S3method(take,data.frame) S3method(take_all,data.frame) diff --git a/NEWS b/NEWS index c5d6376..e251b7e 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +0.8.3 (2022-04-02) +================ +* now 'rows' respects 'etable' class + 0.8.2 (2021-05-25) ================ * fix serious bug with '%to%' in the multiassignment expression in the 'let' diff --git a/R/columns.R b/R/columns.R index ce78cb8..11a5fa2 100644 --- a/R/columns.R +++ b/R/columns.R @@ -352,18 +352,28 @@ rows.data.frame = function(data, ...){ stop(sprintf("'rows': it seems you use '=' instead of '==': %s.", curr_names)) } - + parent_frame = parent.frame() + # if data is expression we want to calculate it only once + data = force(data) # NULL is just a placeholder expr = substitute( NULL[Reduce(f = '&', list(...)),] ) - parent_frame = parent.frame() - # if data is expression we want to calculate it only once - data = force(data) eval_in_parent_frame(data, expr, frame = parent_frame) } +#' @export +rows.etable = function(data, ...){ + data_class = class(data) + data = as.data.table(data) + res = eval.parent( + substitute(maditr::rows(data, ...)) + ) + setDF(res) + class(res) = data_class + res +} diff --git a/inst/tinytest/test_dplyr_verbs.R b/inst/tinytest/test_dplyr_verbs.R index 54d3e6c..b6019e8 100644 --- a/inst/tinytest/test_dplyr_verbs.R +++ b/inst/tinytest/test_dplyr_verbs.R @@ -107,6 +107,18 @@ expect_identical( rows(mtcars, rowSums(vs %to% am)>0), dt_mt[vs>0 | am>0, ] ) + +etab = data.frame(a = 1:2, b = 3:4) +class(etab) = c("etable", class(etab)) +res = etab[2,, drop = FALSE] +rownames(res) = NULL +expect_equal(res, rows(etab, 2)) + +etab = data.frame(a = 1:2, b = 3:4) +class(etab) = c("etable", class(etab)) +res = etab[1,, drop = FALSE] +rownames(res) = NULL +expect_equal(res, rows(etab, b<4)) ########################## cat("\nContext:", "dt_arrange", "\n")