2013-04-10 4 views
10

登録されている古いスタイルのS3クラスの演算子のオーバーロードが新しいクラスを定義して演算子のオーバーロード作業。setOldClassを使用するときのオーバーロード演算子がS4クラスと比較して必要ないように動作する

次の例に示すとおりです。

これは機能しません。

require(ff) 
setOldClass(Classes=c("ff_vector")) 
setMethod( 
    f="*", 
    signature = signature(e1 = c("ff_vector"), e2 = c("ff_vector")), 
    definition = function (e1, e2){ 
     print("S3 setOldClass") 
     e1[] * e2[] 
    } 
) 
ff(1:10) * ff(1:10) 
Error in ff(1:10) * ff(1:10) : non-numeric argument to binary operator 

しかし、これは機能します。部分的な答えで

setClass("myff_vector", representation(x="ff_vector")) 
setMethod( 
    f="*", 
    signature = signature(e1 = c("myff_vector"), e2 = c("myff_vector")), 
    definition = function (e1, e2){ 
     print("S4 setOldClass") 
     [email protected][] * [email protected][] 
    } 
) 
new("myff_vector", x = ff(1:10)) * new("myff_vector", x = ff(1:10)) 
[1] "S4 setOldClass" 
[1] 1 4 9 16 25 36 49 64 81 100 

答えて

0

試み:ヘルプの (「メソッド」)、汎用関数セクションでは、それが記載されている:

方法が最もプリミティブのために定義され、そして対応することが可能メタデータ が保存されます。プリミティブへの呼び出しは、 をCコードに直接送ります。このコードは、適用可能な のメソッドをチェックすることがあります。定義は、「時々」方法は セッションとにロードされたいくつかのパッケージ内の機能のために検出されていなければならないことである ISS4(x)は の場合には、第1引数 TRUE(又は第二引数のためのものですバイナリ演算子)。戻るあなたの問題へ

は、 *は原始的で、かつ:

library(ff) 
setOldClass("ff_vector") 
isS4(ff(1:10)) 
[1] FALSE 

だから、私が理解、あなたが使用している場合でも、S3クラスの原始的な機能のためのメソッドを定義することはできませんから、 setOldClass()。

0

それは、これが答えとして数えますが、記録のために、オペレータが任意のsetOldClassまたはS4なし、無地でシンプルなS3-スタイルで過負荷状態にすることができるかどうかを質問から、本当にはっきりしていない:

`*.ff_vector` <- function(x, y) { 
    print("hi") 
    x[] * y[] 
} 

> ff(1:10) * ff(1:10) 
[1] "hi" 
[1] 1 4 9 16 25 36 49 64 81 100 
関連する問題