From 384e9e5bddf4600d8d34400e561e720e88cda7aa Mon Sep 17 00:00:00 2001 From: hcirellu Date: Thu, 13 Nov 2025 13:24:40 +0100 Subject: [PATCH 1/4] support zero length input in match.integer64 --- R/highlevel64.R | 3 +++ R/integer64.R | 2 +- tests/testthat/test-integer64.R | 10 ++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/R/highlevel64.R b/R/highlevel64.R index ab6ee8d..7bc4faf 100644 --- a/R/highlevel64.R +++ b/R/highlevel64.R @@ -1355,6 +1355,9 @@ optimizer64 <- function(nsmall=2L^16L, #' @keywords manip logic #' @export match.integer64 <- function(x, table, nomatch = NA_integer_, nunique=NULL, method=NULL, ...) { + # trivial cases for zero length input + if (!length(x)) return(integer()) + if (!length(table)) return(rep(as.integer(c(nomatch[[1L]], NA_integer_)[1L]), length(x))) stopifnot(is.integer64(x)) table <- as.integer64(table) cache_env <- cache(table) diff --git a/R/integer64.R b/R/integer64.R index f8eb4f8..46c70a1 100644 --- a/R/integer64.R +++ b/R/integer64.R @@ -593,7 +593,7 @@ binattr <- function(e1, e2) { if (length(d1)) { if (length(d2)) { if (!identical(dim(e1), dim(e2))) - stop("non-conformable arrays") + stop(gettext("non-conformable arrays", domain="R")) } else { if (n2 > n1 && n1) stop("length(e2) does not match dim(e1)") diff --git a/tests/testthat/test-integer64.R b/tests/testthat/test-integer64.R index ecdc9eb..b3f913c 100644 --- a/tests/testthat/test-integer64.R +++ b/tests/testthat/test-integer64.R @@ -482,3 +482,13 @@ test_that("anyNA method", { expect_identical(anyNA(as.integer64(c(NA, NA))), anyNA(c(NA, NA))) expect_identical(anyNA(integer64()), anyNA(integer())) }) + + +test_that("match works with zero length input", { + x32 = as.integer64(1:10) + x64 = as.integer64(1:10) + expect_identical(match(x64, integer()), match(x32, integer())) + expect_identical(match(x64, integer(), nomatch=NULL), match(x32, integer(), nomatch=NULL)) + expect_identical(match(x64, integer(), nomatch=10L), match(x32, integer(), nomatch=10L)) + expect_identical(match(integer(), x64), match(integer(), x32)) +}) From dc8bc5d9047cddb2e81155ef724fcb31343600e2 Mon Sep 17 00:00:00 2001 From: Michael Chirico Date: Thu, 13 Nov 2025 10:03:37 -0800 Subject: [PATCH 2/4] new test with nomatch=integer() --- tests/testthat/test-integer64.R | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/testthat/test-integer64.R b/tests/testthat/test-integer64.R index b3f913c..fe661d6 100644 --- a/tests/testthat/test-integer64.R +++ b/tests/testthat/test-integer64.R @@ -489,6 +489,7 @@ test_that("match works with zero length input", { x64 = as.integer64(1:10) expect_identical(match(x64, integer()), match(x32, integer())) expect_identical(match(x64, integer(), nomatch=NULL), match(x32, integer(), nomatch=NULL)) + expect_identical(match(x64, integer(), nomatch=integer()), match(x32, integer(), nomatch=integer())) expect_identical(match(x64, integer(), nomatch=10L), match(x32, integer(), nomatch=10L)) expect_identical(match(integer(), x64), match(integer(), x32)) }) From f7463c75eb4efbd3c540f4a4bc0628efa3fa9b81 Mon Sep 17 00:00:00 2001 From: Michael Chirico Date: Thu, 13 Nov 2025 10:05:21 -0800 Subject: [PATCH 3/4] put nomatch assignment on its own line for clarity --- R/highlevel64.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/R/highlevel64.R b/R/highlevel64.R index 7bc4faf..eb73517 100644 --- a/R/highlevel64.R +++ b/R/highlevel64.R @@ -1357,7 +1357,10 @@ optimizer64 <- function(nsmall=2L^16L, match.integer64 <- function(x, table, nomatch = NA_integer_, nunique=NULL, method=NULL, ...) { # trivial cases for zero length input if (!length(x)) return(integer()) - if (!length(table)) return(rep(as.integer(c(nomatch[[1L]], NA_integer_)[1L]), length(x))) + if (!length(table)) { + nomatch = as.integer(c(nomatch, NA_integer_)[1L]) + return(rep(nomatch, length(x))) + } stopifnot(is.integer64(x)) table <- as.integer64(table) cache_env <- cache(table) From 9f1b00dad3dd6dc9d31406c9da399f9b71cbbf5c Mon Sep 17 00:00:00 2001 From: Michael Chirico Date: Thu, 13 Nov 2025 10:06:35 -0800 Subject: [PATCH 4/4] assume x32 is meant to be integer for consistency --- tests/testthat/test-integer64.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-integer64.R b/tests/testthat/test-integer64.R index fe661d6..c66d8d3 100644 --- a/tests/testthat/test-integer64.R +++ b/tests/testthat/test-integer64.R @@ -485,7 +485,7 @@ test_that("anyNA method", { test_that("match works with zero length input", { - x32 = as.integer64(1:10) + x32 = 1:10 x64 = as.integer64(1:10) expect_identical(match(x64, integer()), match(x32, integer())) expect_identical(match(x64, integer(), nomatch=NULL), match(x32, integer(), nomatch=NULL))