2011-12-27 4 views
2

私は関数myFunctionを持っています。私は同じ名前のS4メソッドを作成する必要があります。
私は古い機能をmyFunctionにしておきたいと思います。すでに同じ名前の関数がある場合は、S4メソッドを定義してください。

古い機能を維持する方法はありますか?

署名は非常に異なる場合がありますように私はむしろ、この古い機能のための一般的な設定ではないでしょう...

+0

**(私は2つのいずれかを削除することによって解決しなければならないこと) 、またはS4システムがそれに対処するように設計されている場合。私はシステムを騙したくはありません。 – RockScience

答えて

5

はい、あなたの古い機能を維持するための方法があります。そして、S3とS4の両方の関数が同じクラスの同じ数の引数を受け入れることを望んでいない限り、それはやることさえ複雑ではありません。

# Create an S3 function named "myFun" 
myFun <- function(x) cat(x, "\n") 

# Create an S4 function named "myFun", dispatched when myFun() is called with 
# a single numeric argument 
setMethod("myFun", signature=signature(x="numeric"), function(x) rnorm(x)) 

# When called with a numeric argument, the S4 function is dispatched 
myFun(6) 
# [1] 0.3502462 -1.3327865 -0.9338347 -0.7718385 0.7593676 0.3961752 

# When called with any other class of argument, the S3 function is dispatched 
myFun("hello") 
# hello 

あなたはは、Rは、いくつかを持っているように、引数のクラスを設定するには、次のような何かをする必要があります、S3関数と引数の同じ型を取るためにS4の機能をしたいですか場合あなたはそれを使用しようとしている2つの関数の卜の方法:基本的に私はそれが**紛争のケースであるかどうかを知りたい

setMethod("myFun", signature=signature(x="greeting"), 
      function(x) cat(x, x, x, "\n")) 

# Create an object of class "greeting" that will dispatch the just-created 
# S4 function 
XX <- "hello" 
class(XX) <- "greeting" 
myFun(XX) 
# hello hello hello 

# A supplied argument of class "character" still dispatches the S3 function 
myFun("hello") 
# hello 
+0

古いmyFunに引数がないとどうなりますか? – RockScience

+0

正式な引数がない(例えば 'search()'など)か、デフォルトの引数はありませんか?いずれにしても、それは重要な違いをもたらすはずです。 (しかし私はS3関数に与えた無関係のデフォルト引数を削除するために私の答えを少し編集します。) –

+0

はい私は公式な引数を意味しません。新しいメソッドを設定するとき、Rはこのメソッドの汎用として古いmyFunを使用するため、違いがあります。そして、この関数を使ってディスパッチを行うことができないというエラーメッセージが表示されます。 私が今理解しているように、このような関数は一般的なものではないかもしれませんが、この名前を持つメソッドを使うのは良い方法ではありません。私はそれが紛争の一例だと思う。どのようにしてこの問題がどのように対処されているのかご存じですか? – RockScience

関連する問題