0
私自身のS4クラスオブジェクトに対して、Matrix
パッケージから関数rankMatrix
を定義したいとします。私は場合関数を汎用的に設定し、パッケージ内の異なる引数でオーバーロードする正しい方法
library(devtools); library(roxygen2); library(Matrix)
########################################################
################ code used in the package ##############
#' testclass
#'
#' @import Matrix
#' @import methods
#' @export
setClass("MatrixReloaded", slots = list(sl = "Matrix", sr = "Matrix"))
#' constructor of MatrixReloaded
#' @export
MatrixReloaded <- function(x, y) new("MatrixReloaded", sl = x, sr = y)
# make rankMatrix generic
setGeneric("rankMatrix", Matrix::rankMatrix)
# and define new method for class MatrixReloaded
setMethod("rankMatrix", signature(x = "MatrixReloaded"),
function(x, tol)
rankMatrix(x = [email protected], tol = tol) +
rankMatrix(x = [email protected], tol = tol)
)
########################################################
########################################################
# Create a MatrixReloaded object
(newobj <- MatrixReloaded(Diagonal(1), Matrix(1:10, ncol=2)))
#### and compare results
# sum the ranks individually -- works as rankMatrix
# can handle objects of class Matrix per default
rankMatrix([email protected]) + rankMatrix([email protected])
rankMatrix(newobj) # call rankMatrix on the actual MatrixReloaded object
これがうまく動作するように...特にそうです、methods("rankMatrix")
利回り
rankMatrix,ANY-method rankMatrix,MatrixReloaded-method
実際の問題
:実行中のRセッションでこれを行う簡単なことのようですクラス、コンストラクタ、およびrankMatrix
に関する行を含むパッケージを構築してから、新しいRセッションを開始し、インストールし、package、0をロードするは同じ結果を返しますが、rankMatrix(newobj)
は、関数が正しいクラスに対して呼び出されていないという事実のために失敗します。
- どうしたのですか?
- 一般的なデフォルト関数の引数と完全に一致する必要がありますか?
- デフォルトの関数の引数を無視する方法がありますか(:)
MatrixReloaded
オブジェクトでsvd
を実行しないようにしますか?
「newobj @ sl」は、MatrixReloadedクラスの適切な構造を持つとは思われません。 Matrixだけになり、rankMatrixにはそのシグネチャを持つ項目のメソッドがありません。 –
@ 42-:ありがとうございます。最終行の 'MatrixReloaded'オブジェクト' newobj'の 'rankMatrix'関数が正しいかどうか、すなわち両方の単一行列のランクを合計するかどうか、最後から2番目の行は単なるチェックにすぎません。また 'rankMatrix'(' Matrix'パッケージの一部として)は 'Matrix'オブジェクトでも使うことができるように書かれていますが、このクラスの明示的なメソッドはありません。 – DavidR