7

関数namesを取り上げます。これは R のプリミティブ関数です。プリミティブ関数の場合、暗黙的な S4 ジェネリックが作成されるため、その関数の S4 メソッドを構築できます。

次のように定義された S4 クラスを使用します。

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

ここで、ソート済みまたは未ソートの名前を抽出する関数を作成したいと考えています。names関数を使用してこれを行い、新しい関数などを作成する必要がないようにしたかったのです。これはgetNames()直感的ではないためです。

以下は、何をする必要があるかのアイデアを示しています。

setMethod("names",signature="aClass",
   function(x,ordered=TRUE){
      if(ordered)
        x@values[x@id]
      else
        x@values
   }

namesプリミティブ関数でありordered、暗黙のジェネリックの引数ではないため、これは機能しません。

次の条件下でこれを機能させるにはどうすればよいですか。

  • 関数は、names他のパッケージのオブジェクトを含む、他のすべてのオブジェクトに対して元の動作を維持する必要があります。
  • コードはパッケージで使用できるものでなければなりません
  • コードは、Bioconductor などによって設定された高い基準によって受け入れられる必要があります。
4

1 に答える 1

9

ジェネリックは次のように入手できます

> 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は順序について何も述べていません (たとえば、名前と数値インデックスはサブセット化するためによく使用されます。順序付けられた名前の数値インデックスですか、それとも順序付けられていない名前ですか?)。とにかく新しいジェネリック。

于 2013-08-26T13:43:17.070 に答える