From 4b729cd173b6e6019a614c2d7bbca109b7ab6027 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sat, 10 Oct 2026 12:25:04 +0200 Subject: [PATCH] skip gforce() setup when j is only .N --- R/data.table.R | 18 +++++++++++------- inst/tests/tests.Rraw | 5 +++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/R/data.table.R b/R/data.table.R index 19c3d698fc..3549090d6d 100644 --- a/R/data.table.R +++ b/R/data.table.R @@ -417,7 +417,7 @@ replace_dot_alias = function(e) { return(list(GForce=FALSE, jsub=jsub)) if (!length(ansvars) && !use.I) { - if ( ((is.name(jsub) && jsub==".N") || (jsub %iscall% 'list' && length(jsub)==2L && jsub[[2L]]==".N")) && !length(lhs) ) { + if ( (is.N(jsub) || (jsub %iscall% 'list' && length(jsub)==2L && is.N(jsub[[2L]]))) && !length(lhs) ) { if (verbose) catf("GForce optimized j to '%s' (see ?GForce)\n", deparse(jsub, width.cutoff=200L, nlines=1L)) return(list(GForce=TRUE, jsub=jsub)) } @@ -2073,12 +2073,16 @@ replace_dot_alias = function(e) { } if (verbose) {last.started.at=proc.time();catf("Making each group and running j (GForce %s) ... ", GForce);flush.console()} if (GForce) { - thisEnv = new.env() # not parent=parent.frame() so that gsum is found - for (ii in ansvars) assign(ii, .subset2(x, ii), thisEnv) - assign(".N", len__, thisEnv) # For #334 - #fix for #1683 - if (use.I) assign(".I", seq_len(nrow(x)), thisEnv) - ans = gforce(thisEnv, jsub, o__, f__, len__, irows) # irows needed for #971. + if (!length(ansvars) && !use.I) { # j is only .N (see .optimize_gforce), so gforce() isn't needed + ans = list(len__) + } else { + thisEnv = new.env() # not parent=parent.frame() so that gsum is found + for (ii in ansvars) assign(ii, .subset2(x, ii), thisEnv) + assign(".N", len__, thisEnv) # For #334 + # fix for #1683 + if (use.I) assign(".I", seq_len(nrow(x)), thisEnv) + ans = gforce(thisEnv, jsub, o__, f__, len__, irows) # irows needed for #971. + } gi = if (length(o__)) o__[f__] else f__ g = lapply(grpcols, function(i) .Call(CsubsetVector, groups[[i]], gi)) # use CsubsetVector instead of [ to preserve attributes #5567 diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 78123b73fe..11705c9f54 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -22011,3 +22011,8 @@ test(2388.21, nafill(c(1, NA, NA, 5), type="nocb", limit=1, nan=NaN), c(1, NA, 5 test(2388.22, nafill(c(1L, NA, NA, 5L), type="nocb", limit=1), c(1L, NA, 5L, 5L)) test(2388.23, nafill(c("a", NA, NA), type="const", fill="x", limit=1), c("a", "x", NA)) test(2388.24, nafill(c("a", NA, NA, "z"), type="nocb", limit=1), c("a", NA, "z", "z")) + +# GForce skips the gforce() setup when j is only .N +DT = data.table(a=c(2L,1L,2L,3L,2L)) +test(2389.01, optimize=2L, DT[, .N, by=a, verbose=TRUE], output="GForce optimized j to '.N'", notOutput="gforce initial population") +test(2389.02, optimize=0:2, DT[, list(".N"), by=a], data.table(a=c(2L,1L,3L), V1=".N"))