2

我已经determinant为 R 中的 S4 类重载了该函数。基determinant函数返回一个包含元素modulus和的列表sign;但是,这些值是我的 S4 对象(为此*已重载)。然后我重新定义了这个det函数(我不得不深入研究Matrix包的源代码来弄清楚如何做到这一点,这本身就是一场恐怖表演。)以base::det适应我的环境。

由于我不明白的原因,base::det定义如下:

function (x, ...) 
{
    z <- determinant(x, logarithm = TRUE, ...)
    c(z$sign * exp(z$modulus))
}

在我的对象上调用时,z按预期计算,并且z$sign很好z$modulus。我已经重载*exp因此z$sign * exp(z$modulus)评估为我的一个对象。

但为什么 c

当包裹在c()返回值中时,不再是一个标量数字,而是一个包含一个元素的列表:我的对象。这不是我想要的,它破坏了我的单元测试。一些可选的解决方法:

  1. 重写det,可能会破坏任何需要使用的c().
  2. 我的对象不知何故超载c()(或者是as.vector?)。我什至不知道该怎么做。
  3. 还有什么?

推荐的解决方案是什么,我应该如何进行?以正确的方式记录这种混乱的额外积分roxygen2

(作为参考,这个包现在在 github 上https://github.com/shabbychef/madness

编辑 MWE 如下所示:

require(devtools)
install_github("shabbychef/madness")
require(madness)
xmat <- matrix(rnorm(16),ncol=4)
xmad <- madness(xmat)
detv <- det(xmad)
# detv is a list. I want it to be a madness object:
str(detv)
what_i_want <- detv[[1]]
str(what_i_want)
4

0 回答 0