Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Activate undesirable_function_linter and undesirable_operator_linter #141

Merged
merged 10 commits into from
Jan 22, 2025
10 changes: 7 additions & 3 deletions .lintr.R
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ linters = all_linters(
implicit_assignment_linter(allow_lazy=TRUE, allow_scoped=TRUE),
implicit_integer_linter(allow_colon=TRUE),
semicolon_linter(allow_compound=TRUE),
undesirable_function_linter(fun = modify_defaults(
defaults = default_undesirable_functions,
library = NULL,
options = NULL,
par = NULL,
)),
assignment_linter = NULL,
brace_linter = NULL,
commas_linter = NULL,
Expand All @@ -18,7 +24,5 @@ linters = all_linters(
object_name_linter = NULL,
paren_body_linter = NULL,
quotes_linter = NULL,
todo_comment_linter = NULL,
undesirable_function_linter = NULL,
undesirable_operator_linter = NULL
todo_comment_linter = NULL
)
227 changes: 105 additions & 122 deletions R/integer64.R
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# /*
# R-Code
# S3 atomic 64bit integers for R
# (c) 2011 Jens Oehlschägel
# (c) 2011-2024 Jens Oehlschägel
# (c) 2025 Michael Chirico
# Licence: GPL2
# Provided 'as is', use at your own risk
# Created: 2011-12-11
# Last changed: 2011-12-11
#*/

#' Identity function for class 'integer64'
Expand Down Expand Up @@ -1346,172 +1346,155 @@ round.integer64 <- function(x, digits=0L){

#' @rdname sum.integer64
#' @export
any.integer64 <- function(..., na.rm = FALSE){
any.integer64 = function(..., na.rm=FALSE) {
l <- list(...)
if (length(l)==1L){
.Call(C_any_integer64, l[[1L]], na.rm, logical(1L))
}else{
any(sapply(l, function(e){
if (is.integer64(e)){
.Call(C_any_integer64, e, na.rm, logical(1L))
}else{
any(e, na.rm = na.rm)
}
}), na.rm = na.rm)
}
if (length(l) == 1L)
return(.Call(C_any_integer64, l[[1L]], na.rm, logical(1L)))
any_elts = vapply(l, FUN.VALUE=logical(1L), function(e) {
if (is.integer64(e)) {
.Call(C_any_integer64, e, na.rm, logical(1L))
} else {
any(e, na.rm=na.rm)
}
})
any(any_elts, na.rm=na.rm)
}

#' @rdname sum.integer64
#' @export
all.integer64 <- function(..., na.rm = FALSE){
all.integer64 = function(..., na.rm=FALSE) {
l <- list(...)
if (length(l)==1L){
.Call(C_all_integer64, l[[1L]], na.rm, logical(1L))
}else{
all(sapply(l, function(e){
if (is.integer64(e)){
.Call(C_all_integer64, e, na.rm, logical(1L))
}else{
all(e, na.rm = na.rm)
}
}), na.rm = na.rm)
}
if (length(l) == 1L)
return(.Call(C_all_integer64, l[[1L]], na.rm, logical(1L)))
all_elts = vapply(l, FUN.VALUE=logical(1L), function(e) {
if (is.integer64(e)) {
.Call(C_all_integer64, e, na.rm, logical(1L))
} else {
all(e, na.rm=na.rm)
}
})
all(all_elts, na.rm=na.rm)
}

#' @rdname sum.integer64
#' @export
sum.integer64 <- function(..., na.rm = FALSE){
l <- list(...)
if (length(l)==1L){
ret <- .Call(C_sum_integer64, l[[1L]], na.rm, double(1L))
oldClass(ret) <- "integer64"
ret
}else{
ret <- sapply(l, function(e){
if (is.integer64(e)){
.Call(C_sum_integer64, e, na.rm, double(1L))
}else{
as.integer64(sum(e, na.rm = na.rm))
}
})
oldClass(ret) <- "integer64"
sum(ret, na.rm = na.rm)
sum.integer64 = function(..., na.rm=FALSE) {
l = list(...)
if (length(l) == 1L) {
ret = .Call(C_sum_integer64, l[[1L]], na.rm, double(1L))
oldClass(ret) = "integer64"
ret
} else {
ret = vapply(l, FUN.VALUE=integer64(1L), function(e) {
if (is.integer64(e)) {
.Call(C_sum_integer64, e, na.rm, double(1L))
} else {
as.integer64(sum(e, na.rm=na.rm))
}
})
oldClass(ret) = "integer64"
sum(ret, na.rm=na.rm)
}
}

#' @rdname sum.integer64
#' @export
prod.integer64 <- function(..., na.rm = FALSE){
l <- list(...)
if (length(l)==1L){
ret <- .Call(C_prod_integer64, l[[1L]], na.rm, double(1L))
oldClass(ret) <- "integer64"
ret
}else{
ret <- sapply(l, function(e){
if (is.integer64(e)){
.Call(C_prod_integer64, e, na.rm, double(1L))
}else{
as.integer64(prod(e, na.rm = na.rm))
}
})
oldClass(ret) <- "integer64"
prod(ret, na.rm = na.rm)
prod.integer64 <- function(..., na.rm=FALSE) {
l = list(...)
if (length(l) == 1L) {
ret = .Call(C_prod_integer64, l[[1L]], na.rm, double(1L))
oldClass(ret) = "integer64"
ret
} else {
ret <- vapply(l, FUN.VALUE=integer64(1L), function(e) {
if (is.integer64(e)) {
.Call(C_prod_integer64, e, na.rm, double(1L))
} else {
as.integer64(prod(e, na.rm=na.rm))
}
})
oldClass(ret) = "integer64"
prod(ret, na.rm=na.rm)
}
}

#' @rdname sum.integer64
#' @export
min.integer64 <- function(..., na.rm = FALSE){
l <- list(...)
noval <- TRUE
if (length(l)==1L){
if (length(l[[1L]]))
noval <- FALSE
ret <- .Call(C_min_integer64, l[[1L]], na.rm, double(1L))
oldClass(ret) <- "integer64"
}else{
ret <- sapply(l, function(e){
if (length(e))
noval <<- FALSE
min.integer64 = function(..., na.rm=FALSE) {
l = list(...)
if (length(l) == 1L) {
ret = .Call(C_min_integer64, l[[1L]], na.rm, double(1L))
oldClass(ret) = "integer64"
} else {
ret = vapply(l, FUN.VALUE=integer64(1L), function(e) {
if (is.integer64(e)){
.Call(C_min_integer64, e, na.rm, double(1L))
}else{
as.integer64(min(e, na.rm = na.rm))
} else {
as.integer64(min(e, na.rm=na.rm))
}
})
oldClass(ret) <- "integer64"
ret <- min(ret, na.rm = na.rm)
oldClass(ret) = "integer64"
ret = min(ret, na.rm=na.rm)
}
if (noval)
warning("no non-NA value, returning the highest possible integer64 value +9223372036854775807")
if (!any(lengths(l)))
warning("no non-NA value, returning the highest possible integer64 value +", lim.integer64()[2L])
ret
}

#' @rdname sum.integer64
#' @export
max.integer64 <- function(..., na.rm = FALSE){
l <- list(...)
noval <- TRUE
if (length(l)==1L){
if (length(l[[1L]]))
noval <- FALSE
ret <- .Call(C_max_integer64, l[[1L]], na.rm, double(1L))
oldClass(ret) <- "integer64"
}else{
ret <- sapply(l, function(e){
if (length(e))
noval <<- FALSE
if (is.integer64(e)){
.Call(C_max_integer64, e, na.rm, double(1L))
}else{
as.integer64(max(e, na.rm = na.rm))
}
max.integer64 = function(..., na.rm=FALSE) {
l = list(...)
if (length(l) == 1L) {
ret = .Call(C_max_integer64, l[[1L]], na.rm, double(1L))
oldClass(ret) = "integer64"
} else {
ret <- vapply(l, FUN.VALUE=integer64(1L), function(e) {
if (is.integer64(e)) {
.Call(C_max_integer64, e, na.rm, double(1L))
} else {
as.integer64(max(e, na.rm=na.rm))
}
})
oldClass(ret) <- "integer64"
ret <- max(ret, na.rm = na.rm)
oldClass(ret) = "integer64"
ret = max(ret, na.rm=na.rm)
}
if (noval)
warning("no non-NA value, returning the lowest possible integer64 value -9223372036854775807")
if (!any(lengths(l)))
warning("no non-NA value, returning the lowest possible integer64 value ", lim.integer64()[1L])
ret
}

#' @rdname sum.integer64
#' @export
range.integer64 <- function(..., na.rm = FALSE, finite = FALSE){
range.integer64 = function(..., na.rm=FALSE, finite=FALSE) {
if (finite)
na.rm = TRUE
l <- list(...)
noval <- TRUE
if (length(l)==1L){
if (length(l[[1L]]))
noval <- FALSE
ret <- .Call(C_range_integer64, l[[1L]], na.rm, double(2L))
oldClass(ret) <- "integer64"
}else{
ret <- unlist(sapply(l, function(e){
if (length(e))
noval <<- FALSE
if (is.integer64(e)){
.Call(C_range_integer64, e, na.rm, double(2L))
}else{
as.integer64(range(e, na.rm = na.rm))
}
}))
oldClass(ret) <- "integer64"
ret <- range(ret, na.rm = na.rm)
if (length(l) == 1L) {
ret = .Call(C_range_integer64, l[[1L]], na.rm, double(2L))
oldClass(ret) = "integer64"
} else {
ret <- vapply(l, FUN.VALUE=integer64(2L), function(e) {
if (is.integer64(e)) {
.Call(C_range_integer64, e, na.rm, double(2L))
} else {
as.integer64(range(e, na.rm=na.rm))
}
})
oldClass(ret) = "integer64"
ret = range(ret, na.rm=na.rm)
}
if (noval)
warning("no non-NA value, returning c(+9223372036854775807, -9223372036854775807)")
if (!any(lengths(l)))
warning("no non-NA value, returning c(+", lim.integer64()[2L], ", ", lim.integer64()[1L], ")")
ret
}

#' @rdname sum.integer64
#' @export
lim.integer64 <- function(){
ret <- .Call(C_lim_integer64, double(2L))
oldClass(ret) <- "integer64"
ret
lim.integer64 = function() {
ret = .Call(C_lim_integer64, double(2L))
oldClass(ret) = "integer64"
ret
}

#' @rdname cumsum.integer64
Expand Down
8 changes: 8 additions & 0 deletions tests/testthat/test-integer64.R
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,18 @@ test_that("basic statistics work", {
expect_identical(prod(x[1:5], x[6:10]), as.integer64(factorial(10L)))
expect_identical(min(x), x[1L])
expect_identical(min(x, as.integer64(0L)), as.integer64(0L))
expect_warning(expect_identical(min(integer64()), lim.integer64()[2L]), "no non-NA value")
expect_no_warning(expect_identical(min(x, integer64()), x[1L]))
expect_identical(max(x), x[10L])
expect_identical(max(x, as.integer64(11L)), as.integer64(11L))
expect_warning(expect_identical(max(integer64()), lim.integer64()[1L]), "no non-NA value")
expect_no_warning(expect_identical(max(x, integer64()), x[10L]))
expect_identical(range(x), x[c(1L, 10L)])
expect_identical(range(x, x+1L), c(x[1L], x[10L]+1L))
# TODO(#142): Restore these tests
# expect_identical(range(x, NA_integer64_, finite=TRUE), x[c(1L, 10L)])
expect_warning(expect_identical(range(integer64()), lim.integer64()[2:1]), "no non-NA value")
# expect_no_warning(expect_identical(range(x, integer64()), x[c(1L, 10L)]))

expect_identical(diff(x), as.integer64(rep(1L, 9L)))

Expand Down
Loading