2011-11-10 12 views
0

パッケージ内であっても、時にはベースR内であっても、既存の関数に少しの味を加えたいことがあります。たいていの場合、これは関数の最初または最後に何が起こるべきかを少し変更したものです(愚かな例:デフォルトで末尾にcat関数に改行を入れたいと思います)。元の実装を使用してそれを拡張する上書きメソッド

今、私は単純にその名に私の新しい実装を割り当てることによって、既存のメソッドを上書きすることができます知っている、しかし:どのように、そして、私はまだ古いものを使用することができますか?

cat<-function(... , file = "", sep = " ", fill = FALSE, labels = NULL, 
    append = FALSE) 
{ 
    cat(..., "\n" , file = file, sep = sep, fill = fill, labels = labels, 
    append = append) 
} 

これは新しいものの実装では「古い」catを使用することを意味:catの場合は、私のような何かをしなければならないでしょう。今、私がRの仕事の呼び出しと遅延バインディングについて何かを理解すれば、これは単に失敗します(無限再帰)。

だから、(機能のオブジェクト指向のオーバーライドの精神で)これを達成する方法は、(私はそれがうまく動作 "したい)私の新しい機能に別の名前を与える

  • に頼ることなく、そこにあります他のいくつかの名前(私は 別のRセッションでこの関数を作成するときに、私は余分なステップを忘れてしまったかもしれません)
  • @Andrieが言ったように(元の関数のすべてのソースを使用しての下で、古い機能を保存
  • :それは可能な限り最も洗練されたソリューションを得るために重要です)

これにはパラダイムがありますか?または、私はこれを可能な限り安全な方法でどうやって行うことができますか?それとも、私はあまりにも多くのことを望んでいますか?

を編集してください。@ Andrieの回答があります:これは非常に簡単に行うことができます。しかし、パッケージ内の別の関数が呼び出すパッケージ内の関数の動作を変更したい場合、Andrieのトリックは機能しません。一例として、

:私はglmnetパッケージのプロット関数に多数の追加を行いました。しかし、plot.cv.glmnetなどを見ると、彼らはそのパッケージ内の別の関数に呼び出しを転送するので、私は実際にパッケージに新しいバージョンを注入する必要があることがわかります(ところで、 reassignInPackage)。しかし、もちろん名前空間接頭辞は失敗します。なぜなら、私は名前空間のバージョンを置き換えたからです。この例は、見た目ほどには工夫されていません。一方で、誰かが私の要求をそのような場合に落とすべきであると主張することができますか?それは次に行く最良の方法でしょうか?

答えて

7

私が正しく理解している場合は、namespace::functionを参照するのは簡単なことです。この場合は、機能内でbase::catを使用してください。例えば

cat <- function(... , file = "", sep = " ", fill = FALSE, labels = NULL, 
    append = FALSE) 
{ 
    base::cat(..., "\n" , file = file, sep = sep, fill = fill, labels = labels, 
     append = append) 
} 

> cat("Hello", "world!") 
Hello world! 
> cat("Text on line 2") 
Text on line 2 
+0

<たたく額/>。明白な(あなたの部分からいつものように)優れた観察(いつものように)。いずれにせよ、私はバーを少し上げます(私の編集を数分で見てください)。 –

関連する問題