2013-08-26 10 views
6

names:それはRのプリミティブ関数です。プリミティブ関数の場合、暗黙のS4ジェネリックが作成されるので、その関数のS4メソッドを構築することができます。次のようにプリミティブ関数の暗黙のS4ジェネリックに余分な引数を追加

は、定義されたS4クラスを取る:

setClass("aClass", 
     representation=list(
      values = "character", 
      id = "numeric" 
      ), 
     prototype=list(
      values = character(0), 
      id = numeric(0)), 
     validity=function(object){ 
      length([email protected])==length([email protected]) 
     } 
     ) 

を今私は、ソートまたはソートされていないのいずれか、名前を抽出するための関数を作成します。私はこれを、namesという関数を使って新しい機能(getNames()など)を作る必要がないようにしたいと思いました。それはそれほど直感的ではありません。

以下が何をすべきかのアイデアを与える:

setMethod("names",signature="aClass", 
    function(x,ordered=TRUE){ 
     if(ordered) 
     [email protected][[email protected]] 
     else 
     [email protected] 
    } 

namesは原始関数であり、orderedが暗黙のジェネリックの引数ではありませんので、これは、動作しません。

はどのようにして、以下の条件の下で、この作業を行うことができます。

  • names機能は他のパッケージからオブジェクトを含め、他のすべてのオブジェクトのために元の動作を維持する必要があります。
  • コードはパッケージ内で使用するために許容されるべきである。
  • コードはBioconductorなどで設定された高い基準で許容されるべきである。

答えて

5

一般的なので、署名からあなたは短い答えは、あなたが引数を追加することができないということであることがわかります

> getGeneric("names") 
standardGeneric for "names" defined from package "base" 

function (x) 
standardGeneric("names", .Primitive("names")) 
<environment: 0x459c9c0> 
Methods may be defined for arguments: x 
Use showMethods("names") for currently available ones. 

として使用可能です。間違いなく独自の関数namesを作成する必要はありません。ハックはパッケージ全体の変数getOption("pkg_names_ordered")を使用しますが、私は自分自身でその解決法に参加しません。

namesで定義されている契約では、注文について何も言わない(たとえば、名前や数値indeciesがサブセットに使用されることが多い;順序付けされた名前や順序付けられていない名前の数値インデックスですか?あなたは本当に新しいジェネリックを提案しています。

+0

答えてくれてありがとうございますが、それは私の質問で言ったことです:私は余分な引数を使用することはできません。数値インデックスは、順序付けられた名前と他のスロットのセット(実際のオブジェクトははるかに複雑であり、すべてのスロットを順序付けることはできません)です。私は、オブジェクトが注文されたかどうかを示す余分なスロットを使用します。私は、順序付けられた名前を「並べ替える」ために長い道のりを歩んでいます。しかし、私はハッキングせずにこれを行う方法を見つけることを望んだ。パッケージグローバル変数は、有効なオプションを考慮しなくてもよい種類のハックです。 :) –

+2

あなたの質問からはい、あなたは答えがノーだと思ったようでしたが、あなたが質問したので、私は答えました;) –

+0

私は周りに何か方法があることを期待していましたが、 "いいえ"と解決しなければなりません:)私はそれにもう少しの日を与えます。そしてあなたはあなたの受け入れられた答えを持っています。 –

関連する問題