我已经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()
返回值中时,不再是一个标量数字,而是一个包含一个元素的列表:我的对象。这不是我想要的,它破坏了我的单元测试。一些可选的解决方法:
- 重写
det
,可能会破坏任何需要使用的c()
. - 我的对象不知何故超载
c()
(或者是as.vector
?)。我什至不知道该怎么做。 - 还有什么?
推荐的解决方案是什么,我应该如何进行?以正确的方式记录这种混乱的额外积分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)