2

determinantR で S4 クラスの関数をオーバーロードしました。基本determinant関数は、要素modulussign;を含むリストを返します。ただし、値は私のS4オブジェクトです(*オーバーロードされています)。次に、自分の環境に合わせて関数を再定義しました(これを行う方法を理解するためdetに、パッケージのソース コードを掘り下げる必要がありました。これは、それ自体がホラーショーでした)。Matrixbase::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) を含むリストになります。これは私が望んでいるものではなく、単体テストに違反しています。いくつかのオプションの回避策:

  1. を書き直しdetて、 の使用に必要なものを破壊する可能性がありc()ます。
  2. どういうわけか、オブジェクトをオーバーロードしますc()(またはそれですか?)。as.vector私はそれを行う方法さえわかりません。
  3. 他の何か?

推奨される解決策は何ですか? また、どのように進めればよいですか? でこの混乱を文書化する適切な方法についての追加のポイント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)
4

0 に答える 0