为什么 min(200, 300) returns 300 for integer64 class
Why does min(200, 300) returns 300 for integer64 class
我遇到了以下对我来说似乎非常不直观的结果:
library(bit64)
x = as.integer64(200)
y = as.integer64(300)
min(x, y)
integer64
[1] 300
min.integer64(x, y)
integer64
[1] 300
肯定有一些明显的东西我不明白,但有人可以指出给我吗?
> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS: /usr/lib64/libblas.so.3.4.2
LAPACK: /usr/lib64/liblapack.so.3.4.2
locale:
[1] LC_CTYPE=en_US.utf8 LC_NUMERIC=C
[3] LC_TIME=en_US.utf8 LC_COLLATE=en_US.utf8
[5] LC_MONETARY=en_US.utf8 LC_MESSAGES=en_US.utf8
[7] LC_PAPER=en_US.utf8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] bit64_0.9-7 bit_1.1-14
loaded via a namespace (and not attached):
[1] compiler_3.6.1
我很确定这是一个错误。请将其报告给软件包维护者。
如果我稍微更改 min.integer64
的定义,它会正常工作:
assignInNamespace("min.integer64",
function (..., na.rm = FALSE)
{
l <- list(...)
ret <- double(1)
noval <- TRUE
if (length(l) == 1) {
if (length(l[[1]]))
noval <- FALSE
.Call(bit64:::C_min_integer64, l[[1]], na.rm, ret)
oldClass(ret) <- "integer64"
}
else {
ret <- sapply(l, function(e) {
if (length(e))
noval <<- FALSE
if (is.integer64(e)) {
ret <- double(1) #this was missing
.Call(bit64:::C_min_integer64, e, na.rm, ret)
ret
}
else {
as.integer64(min(e, na.rm = na.rm))
}
})
oldClass(ret) <- "integer64"
ret <- min(ret, na.rm = na.rm)
}
if (noval)
warning("no non-NA value, returning +9223372036854775807")
ret
}, pos = "package:bit64")
min(x, y)
#integer64
#[1] 200
min(y, x)
#integer64
#[1] 200
对不起,这只是一个错误。我早该知道并且已经在修复它了。
不幸的是,我的下一个包 'bit'、'bit64'、'ff' 包的部署涉及包 'bit' 中关于 class 'bitwhich' 的接口更改。这意味着(在测试完成后)宣布接口更改为 R-package-devel 并等待 4 周,直到部署到 CRAN。因此,您可以更快地从 r-forge 获得修复(目前还没有)。一旦对 r-forge 进行了修复,我就会在这里通知您。
亲切的问候
詹斯
我遇到了以下对我来说似乎非常不直观的结果:
library(bit64)
x = as.integer64(200)
y = as.integer64(300)
min(x, y)
integer64
[1] 300
min.integer64(x, y)
integer64
[1] 300
肯定有一些明显的东西我不明白,但有人可以指出给我吗?
> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS: /usr/lib64/libblas.so.3.4.2
LAPACK: /usr/lib64/liblapack.so.3.4.2
locale:
[1] LC_CTYPE=en_US.utf8 LC_NUMERIC=C
[3] LC_TIME=en_US.utf8 LC_COLLATE=en_US.utf8
[5] LC_MONETARY=en_US.utf8 LC_MESSAGES=en_US.utf8
[7] LC_PAPER=en_US.utf8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] bit64_0.9-7 bit_1.1-14
loaded via a namespace (and not attached):
[1] compiler_3.6.1
我很确定这是一个错误。请将其报告给软件包维护者。
如果我稍微更改 min.integer64
的定义,它会正常工作:
assignInNamespace("min.integer64",
function (..., na.rm = FALSE)
{
l <- list(...)
ret <- double(1)
noval <- TRUE
if (length(l) == 1) {
if (length(l[[1]]))
noval <- FALSE
.Call(bit64:::C_min_integer64, l[[1]], na.rm, ret)
oldClass(ret) <- "integer64"
}
else {
ret <- sapply(l, function(e) {
if (length(e))
noval <<- FALSE
if (is.integer64(e)) {
ret <- double(1) #this was missing
.Call(bit64:::C_min_integer64, e, na.rm, ret)
ret
}
else {
as.integer64(min(e, na.rm = na.rm))
}
})
oldClass(ret) <- "integer64"
ret <- min(ret, na.rm = na.rm)
}
if (noval)
warning("no non-NA value, returning +9223372036854775807")
ret
}, pos = "package:bit64")
min(x, y)
#integer64
#[1] 200
min(y, x)
#integer64
#[1] 200
对不起,这只是一个错误。我早该知道并且已经在修复它了。 不幸的是,我的下一个包 'bit'、'bit64'、'ff' 包的部署涉及包 'bit' 中关于 class 'bitwhich' 的接口更改。这意味着(在测试完成后)宣布接口更改为 R-package-devel 并等待 4 周,直到部署到 CRAN。因此,您可以更快地从 r-forge 获得修复(目前还没有)。一旦对 r-forge 进行了修复,我就会在这里通知您。 亲切的问候 詹斯