2016-06-01 7 views
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を実行しないようにしますか?
+0

「newobj @ sl」は、MatrixReloadedクラスの適切な構造を持つとは思われません。 Matrixだけになり、rankMatrixにはそのシグネチャを持つ項目のメソッドがありません。 –

+0

@ 42-:ありがとうございます。最終行の 'MatrixReloaded'オブジェクト' newobj'の 'rankMatrix'関数が正しいかどうか、すなわち両方の単一行列のランクを合計するかどうか、最後から2番目の行は単なるチェックにすぎません。また 'rankMatrix'(' Matrix'パッケージの一部として)は 'Matrix'オブジェクトでも使うことができるように書かれていますが、このクラスの明示的なメソッドはありません。 – DavidR

答えて

0

私の最初の問題の解決方法は非常に簡単です。@exportを忘れました。 here

関連する問題