spatstat中Kcross与crosspairs整数溢出错误处理咨询
spatstat Kcross函数大规模点数据整数溢出问题处理方案
问题本质
该报错是2.3-4版本spatstat的已知代码bug,复现环境为64位Windows 10专业版、R 4.1.0:crosspairs函数的新版实现逻辑中,计算两类点的总点对数nX * nY时未做64位类型兼容,当点对总数超过R语言32位整数上限.Machine$integer.max(值为2147483647)时会触发整数溢出,返回NA值,导致后续if (nXY <= 1024)的条件判断因输入NA直接抛出错误。
以测试数据为例,8062 * 1768988的结果远大于32位整数上限,刚好触发该问题。
临时规避方法
设置spatstat.options("crosspairs.newcode" = FALSE)是可用的临时应急方案:该选项会切换回旧版crosspairs实现,旧逻辑不会提前计算总点对数做内存预分配判断,因此不会触发该溢出错误。
注意:旧版实现的内存预分配逻辑效率低于新版,处理超大规模点数据时计算速度会明显变慢,不建议长期保持该选项为关闭状态。
正式修复方案
据spatstat核心作者Adrian Baddeley答复,该整数溢出bug已在新版
spatstat.geom(版本号v2.4-0.029)中完成修复。安装该更新版本后,无需手动修改任何spatstat选项,Kcross等所有依赖crosspairs的函数即可正常处理点对数超过32位整数上限的大规模点数据,同时保留新版代码的计算效率。
错误复现代码
library(spatstat) # 构建研究窗口 W <- as.owin(list(xrange = c(688.512, 17879.746) , yrange = c(-27996.842, -7759.813))) # 生成两类模拟点 cells1 <- runifpoint(n = 8062, win = W) cells2 <- runifpoint(n = 1768988, win = W) cells3 <- superimpose(tumor = cells1 , bcell = cells2) # 调用Kcross触发错误 Kcross(cells3 , r = seq(0,200,by=5) , "tumor" , "bcell" , correction="none") # 报错输出: # Error in if (nXY <= 1024) { : missing value where TRUE/FALSE needed # In addition: Warning message: In nX * nY : NAs produced by integer overflow # 验证整数溢出 8062 * 1768988 > .Machine$integer.max # [1] TRUE
触发bug的根源代码段
if (spatstat.options("crosspairs.newcode")) { nXY <- nX * nY if (nXY <= 1024) { nsize <- 1024 }
内容的提问来源于stack exchange,提问作者Sergej S
相关产品推荐
相关产品推荐

