mpfr数据触发is.atomic错误时,如何使用R函数(如var())?
解决mpfr向量使用常规函数触发is.atomic错误的问题
针对var()处理mpfr向量的快速解法
Rmpfr包已支持sd()函数直接处理mpfr对象,而方差是标准差的平方,因此可直接通过以下方式计算:
library(Rmpfr) x.mpfr <- 1:11 + Rmpfr::mpfr(1.e20, precBits = 1000) # 用sd的平方替代var sd(x.mpfr)^2
通用解决方案(无需重写完整函数逻辑)
当常规函数因is.atomic检查无法处理mpfr对象时,可按以下思路处理:
- 优先复用Rmpfr已支持的函数:Rmpfr为多数基础统计函数(如
mean、sum、sd、min、max等)实现了S4方法,可直接调用。对于未直接支持的函数,可通过这些已支持的函数组合实现,比如用mean((x - mean(x))^2) * (length(x)-1)/length(x)计算总体方差。 - 为mpfr类定义轻量S4方法:如果组合实现不够便捷,可以为目标函数快速定义mpfr适配的方法,仅复用核心运算逻辑。比如为
var()定义mpfr方法:
setMethod("var", signature(x = "mpfr"), function(x, y = NULL, na.rm = FALSE, use) { if (!is.null(y)) stop("暂不支持mpfr对象的双变量方差计算") if (na.rm) x <- x[!is.na(x)] n <- length(x) if (n <= 1) return(mpfr(0, precBits = getPrec(x))) m <- mean(x) sum((x - m)^2) / (n - 1) }) # 定义后即可直接调用var var(x.mpfr)
- 避免转numeric类型:直接转换为
numeric会丢失mpfr的高精度特性,完全违背使用该类型的初衷,除非你明确不需要高精度。
内容的提问来源于stack exchange,提问作者J.Z.
相关产品推荐
相关产品推荐

