2つのクラス(a
と)があり、それらのメソッドb
を定義したいと思います。+
2つのクラスの4つの可能な組み合わせに対して、異なるメソッドが必要です。
a + a method 1
a + b method 2
b + a method 3
b + b method 4
S4を多重ディスパッチに使用できることは知っていますが、S3を使用してこの動作をエミュレートする方法があるかどうかを知りたいです。私のアプローチは次のとおりです。
a <- "b"
class(a) <- "a"
b <- "e"
class(b) <- "b"
Ops.a <- function(e1, e2){
if (class(e1) == "a" &
class(e2) == "a")
print("a & a")
if (class(e1) == "a" &
class(e2) == "b")
print("a & b")
if (class(e1) == "b" &
class(e2) == "a")
print("b & a")
NULL
}
a + a
a + b
b + a
これはすべて正常に機能しますが、もちろん次のことは定義されていません。
b + b
この場合をカバーするために、別のメソッド定義を追加しました。
Ops.b <- function(e1, e2){
if (class(e1) == "b" &
class(e2) == "b")
print("b & b")
NULL
}
これによりb + b
動作しますが、現在a + b
、b + a
メソッドに一貫性がなく、エラーが発生します。
> a + b
error in a + b : non-numeric argument for binary operator
additional: warning:
incompatible methods ("Ops.a", "Ops.b") for "+"
S3を使用して4つのケースすべてを適切に定義する方法はありますか?