From 6f8ac786f0489189b59886558cd8c99c561aeb09 Mon Sep 17 00:00:00 2001 From: venom1204 Date: Thu, 11 Jun 2026 19:38:37 +0000 Subject: [PATCH 1/3] .. --- R/fcast.R | 13 +++++++++++-- inst/tests/tests.Rraw | 8 ++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/R/fcast.R b/R/fcast.R index 3de3fcb8f6..c8ef439c78 100644 --- a/R/fcast.R +++ b/R/fcast.R @@ -168,10 +168,19 @@ dcast.data.table = function(data, formula, fun.aggregate = NULL, sep = "_", ..., setDT(dat) m = as.list(match.call()[-1L]) - subset = m[["subset"]][[2L]] + subset = m[["subset"]] if (!is.null(subset)) { + if (is.call(subset) && (subset[[1L]] == quote(.) || subset[[1L]] == quote(list))) { + subset = subset[[2L]] + } if (is.name(subset)) subset = as.call(list(quote(`(`), subset)) - idx = which(eval(subset, data, parent.frame())) # any advantage thro' secondary keys? + idx = eval(subset, data, parent.frame()) + if (is.logical(idx) && length(idx) == 1L) { + idx = if (!is.na(idx) && idx) seq_len(nrow(data)) else integer(0) + } else { + idx = which(idx) # which() returns indices of TRUE, ignores FALSE and NA + } + dat = .Call(CsubsetDT, dat, idx, seq_along(dat)) } fun.call = m[["fun.aggregate"]] diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 687bf929ed..256a1c049e 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21660,3 +21660,11 @@ test(2374.08, key(DT[, .(a, a)]), NULL) test(2374.09, key(subset(DT, select=c(a, a))), NULL) DT = data.table(a=1:2, a.1=3:4, val=10:11) test(2374.10, key(DT[, .(a.1, sum(val)), keyby=.(a, a)]), NULL) + +# dcast() subset supports base-style logical expressions, #4325 +DT = data.table( a = rep(1:5, 3), b = rep(1:3, each = 5), v = 1:15) +y = data.table(a=2:5, `1`=2:5, `2`=7:10, `3`=12:15) +setkey(y, a) +test(2375.1, dcast(DT, a ~ b, value.var="v", subset=a > 1), y) +test(2375.2, dcast(DT, a ~ b, value.var="v", subset=.(a > 1)), y) +test(2375.3, identical( dcast(DT, a ~ b, value.var="v", subset=a > 2 & b != 2), dcast(DT, a ~ b, value.var="v", subset=.(a > 2 & b != 2)) ), TRUE) From 554ef507e2bf8ecb496e234071820c998af88f45 Mon Sep 17 00:00:00 2001 From: venom1204 Date: Thu, 11 Jun 2026 19:48:37 +0000 Subject: [PATCH 2/3] lint --- R/fcast.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/fcast.R b/R/fcast.R index c8ef439c78..18206a1065 100644 --- a/R/fcast.R +++ b/R/fcast.R @@ -180,7 +180,6 @@ dcast.data.table = function(data, formula, fun.aggregate = NULL, sep = "_", ..., } else { idx = which(idx) # which() returns indices of TRUE, ignores FALSE and NA } - dat = .Call(CsubsetDT, dat, idx, seq_along(dat)) } fun.call = m[["fun.aggregate"]] From 0b5441f55ca6ca68cd1795435587153e283e7e58 Mon Sep 17 00:00:00 2001 From: venom1204 Date: Thu, 11 Jun 2026 19:59:16 +0000 Subject: [PATCH 3/3] added test --- inst/tests/tests.Rraw | 2 ++ 1 file changed, 2 insertions(+) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 256a1c049e..5e866cc186 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21668,3 +21668,5 @@ setkey(y, a) test(2375.1, dcast(DT, a ~ b, value.var="v", subset=a > 1), y) test(2375.2, dcast(DT, a ~ b, value.var="v", subset=.(a > 1)), y) test(2375.3, identical( dcast(DT, a ~ b, value.var="v", subset=a > 2 & b != 2), dcast(DT, a ~ b, value.var="v", subset=.(a > 2 & b != 2)) ), TRUE) +test(2375.4, dcast(DT, a ~ b, value.var="v", subset=TRUE), dcast(DT, a ~ b, value.var="v")) +test(2375.5, nrow(dcast(DT, a ~ b, value.var="v", subset=FALSE)), 0L)