2016-09-12 5 views
1

いくつかのカスタムクラスに適用されるsvd関数のS3メソッドを作成しようとしています。できるだけ再現可能なものにするために、問題を示すために以下の簡単な例があります。'svd'にS3メソッドをエクスポートして使用しますか?

roxygen2を使用する:

# create generic 
svd <- function(x, ...) UseMethod("svd") 

# add defai;t 
svd.default <- base::svd 

#' @export 
svd.foo <- function(x, ...){ 
    print("called svd.foo") 
    return(NULL) 
} 

私はその後、パッケージをビルドしてリロードしてください。私はNAMESPACEで見ることができます:

S3method(svd,foo) 

しかし、私はメッセージではなく、次の取得コールしようとすると:それはまだベースsvdメソッドを呼び出します

set.seed(123) 
mat <- matrix(rnorm(16), 4) 
class(mat) <- "foo" 
svd(mat) 
$d 
[1] 2.5909540 2.2850508 1.2608444 0.1467173 

$u 
      [,1]  [,2]  [,3]  [,4] 
[1,] -0.1212454 0.3981507 -0.1101441 0.90257625 
[2,] 0.4356515 0.4471180 -0.7466406 -0.22982835 
[3,] 0.4227691 -0.7681500 -0.3229738 0.35622984 
[4,] -0.7853493 -0.2269518 -0.5710376 -0.07506889 

$v 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.2204894 -0.6736805 -0.2459399 0.66109954 
[2,] 0.7409901 0.3288187 -0.5720323 -0.12486370 
[3,] 0.0478777 -0.6541094 -0.1526053 -0.73929712 
[4,] -0.6324760 0.1008651 -0.7674661 0.02821745 

を。どうすればこれを達成できますか?

+1

'svd'はS3メソッドではありません。ソースコードを見ると、 'UseMethod'はありませんので、呼び出されるたびに通常の' svd'を実行します。 – Carl

+0

これでやってもらえますか?さもなければ、私はS4メソッド用の新しいジェネリックを作成することができます。 – cdeterman

+0

@cdeterman確かに 'svd = function(x、...)UseMethod( 'svd')'と 'svd.default = base :: svd'を提供するだけで' svd'をS3ジェネリックにすることができます。 S4に行く必要はありません。 –

答えて

4

非ジェネリック関数をジェネリックでオーバーライドし、必要なメソッドを提供できます。それがエクスポートするだけで十分です - あなたはない一般@export S3メソッドべき、ハドレーあたりのよう

#' @S3method svd foo 
svd.foo <- function(x, ...) { 
    print("called svd.foo") 
    return(NULL) 
} 

:だからあなたの場合には:もちろん

#' @export svd 
svd = function (x, ...) 
    UseMethod('svd') 

#' @S3method svd default 
svd.default = base::svd 

あなたがしても、独自のメソッドを追加したいですメソッドを@S3methodとマークするために使用されます。

関連する問題