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)
は私のオブジェクトの1つに評価されます。
しかし、なぜ c
?
戻り値がラップされるとc()
、スカラー数値ではなく、1 つの要素 (my object) を含むリストになります。これは私が望んでいるものではなく、単体テストに違反しています。いくつかのオプションの回避策:
- を書き直し
det
て、 の使用に必要なものを破壊する可能性がありc()
ます。 - どういうわけか、オブジェクトをオーバーロードします
c()
(またはそれですか?)。as.vector
私はそれを行う方法さえわかりません。 - 他の何か?
推奨される解決策は何ですか? また、どのように進めればよいですか? でこの混乱を文書化する適切な方法についての追加のポイントroxygen2
。
(参考までに、パッケージはhttps://github.com/shabbychef/madnessの github にあります)
EDIT 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)