From cf022717d4c65de6a1986648f2e4e82b51771161 Mon Sep 17 00:00:00 2001 From: Michael Chirico Date: Sat, 3 Jan 2026 00:26:43 +0000 Subject: [PATCH] fix spurious warning in log(empty) --- NEWS.md | 1 + R/integer64.R | 19 ++++---- tests/testthat/test-integer64.R | 79 +++++++++++++++++---------------- 3 files changed, 52 insertions(+), 47 deletions(-) diff --git a/NEWS.md b/NEWS.md index a60ba7b..18234e1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -49,6 +49,7 @@ 1. `min.integer64`, `max.integer64` and `range.integer64` now support `na.rm=TRUE` correctly when combining across mutliple inputs like `min(x, NA_integer64_, na.rm=TRUE)` (#142). 1. `as.integer64.integer64` is consistent with `as.integer.integer` in terms or returning a plain integer64 vector (i.e., stripped of attributes; #188). Thanks @hcirellu. +1. `log(integer64(), base=integer64(1))` no longer warns, consistent with `log(integer(), base=integer())` (#93). ## NOTES diff --git a/R/integer64.R b/R/integer64.R index 01e5122..f1fc7ed 100644 --- a/R/integer64.R +++ b/R/integer64.R @@ -1247,21 +1247,22 @@ sqrt.integer64 <- function(x) { #' @rdname format.integer64 #' @export -log.integer64 <- function(x, base=NULL) { - a <- attributes(x) - l.x <- length(x) - l.base <- length(base) - l <- if (l.x==0L || (!is.null(base) && l.base==0L)) 0L else max(l.base, l.x) - ret <- double(l) - if (is.null(base)) { +log.integer64 = function(x, base=NULL) { + a = attributes(x) + l.x = length(x) + l.base = length(base) + l = if (l.x==0L || (!is.null(base) && l.base==0L)) 0L else max(l.base, l.x) + ret = double(l) + if (!l.x) { + } else if (is.null(base)) { .Call(C_log_integer64, x, ret) } else if (length(base)==1L) { .Call(C_logbase_integer64, x, as.double(base), ret) } else { .Call(C_logvect_integer64, x, as.double(base), ret) } - a$class <- minusclass(a$class, "integer64") - attributes(ret) <- a + a$class = minusclass(a$class, "integer64") + attributes(ret) = a ret } diff --git a/tests/testthat/test-integer64.R b/tests/testthat/test-integer64.R index 79663eb..cee8046 100644 --- a/tests/testthat/test-integer64.R +++ b/tests/testthat/test-integer64.R @@ -327,62 +327,65 @@ test_that("Old \\dontshow{} tests in ?extract.replace.integer64 continue working test_that("empty inputs give empty outputs for arithmetic", { x = integer64(1L) - y = integer64(0L) + empty = integer64(0L) - expect_identical(x+y, integer64()) - expect_identical(y+x, integer64()) + expect_identical(x+empty, integer64()) + expect_identical(empty+x, integer64()) - expect_identical(x-y, integer64()) - expect_identical(y-x, integer64()) + expect_identical(x-empty, integer64()) + expect_identical(empty-x, integer64()) - expect_identical(+y, integer64()) - expect_identical(-y, integer64()) + expect_identical(+empty, integer64()) + expect_identical(-empty, integer64()) - expect_identical(x*y, integer64()) - expect_identical(y*x, integer64()) + expect_identical(x*empty, integer64()) + expect_identical(empty*x, integer64()) - expect_identical(x/y, double()) - expect_identical(y/x, double()) + expect_identical(x/empty, double()) + expect_identical(empty/x, double()) - expect_identical(x^y, integer64()) - expect_identical(y^x, integer64()) + expect_identical(x^empty, integer64()) + expect_identical(empty^x, integer64()) - expect_identical(x %/% y, integer64()) - expect_identical(y %/% x, integer64()) + expect_identical(x %/% empty, integer64()) + expect_identical(empty %/% x, integer64()) - expect_identical(x%%y, integer64()) - expect_identical(y%%x, integer64()) + expect_identical(x%%empty, integer64()) + expect_identical(empty%%x, integer64()) - expect_identical(log(x, base=y), double()) - # TODO(#93): don't suppress this warning which is inconsistent with integer() - expect_identical(suppressWarnings(log(y, base=x)), double()) + expect_identical(log(x, base=empty), double()) + expect_identical(log(empty, base=x), double()) + expect_identical( + log(`attr<-`(empty, "asdf", "jkl")), + `attr<-`(double(), "asdf", "jkl") + ) - expect_identical(x==y, logical()) - expect_identical(y==x, logical()) + expect_identical(x==empty, logical()) + expect_identical(empty==x, logical()) - expect_identical(x!=y, logical()) - expect_identical(y!=x, logical()) + expect_identical(x!=empty, logical()) + expect_identical(empty!=x, logical()) - expect_identical(x>=y, logical()) - expect_identical(y>=x, logical()) + expect_identical(x>=empty, logical()) + expect_identical(empty>=x, logical()) - expect_identical(x<=y, logical()) - expect_identical(y<=x, logical()) + expect_identical(x<=empty, logical()) + expect_identical(empty<=x, logical()) - expect_identical(x>y, logical()) - expect_identical(y>x, logical()) + expect_identical(x>empty, logical()) + expect_identical(empty>x, logical()) - expect_identical(x