niszetの日記

細かい情報を載せていくブログ

(R) メソッドディスパッチは一番前のclassが使われる仕様…?(メモ)

どこかに書いてあったかなぁ…

まぁ大体わかってるんだけど、一応確認してみる。

# クラスがaaやbbだったら内容にかかわらずaa, bbとそれぞれ表示する
print.bb <- function(x) print("bb")
print.aa <- function(x) print("aa")

# まだ存在しない変数
x
#> Error: object 'x' not found

# classを与える前の挙動の確認
x <- 1
print(x)
#> [1] 1

# class aa を与えてみる
class(x) <- "aa"

# 確認
x
#> [1] "aa"

# class bb を与えてみる
class(x) <- "bb"
x
#> [1] "bb"

# aaとbbをこの順で与えてみる。
class(x) <- c("aa", "bb")

# 先に与えているclassの方の関数が呼ばれる(c()内の左側の要素)
x
#> [1] "aa"

# ランダムに結果が変わったりしない。当たり前か
x
#> [1] "aa"

# 逆順にしてみる
class(x) <- c("bb", "aa")

# やはり先に入っているbbの方が有効
x
#> [1] "bb"

# bbの方のprintを消してみる
rm(print.bb)

# 2番目のclassのaaの方のprintが呼ばれている
x
#> [1] "aa"

というわけで、基本的にはdata.frameなんだけど、ある関数では別の挙動をしてほしいようなときには自作のクラス名を先頭につけ、対応する関数を作成しておく(当然、大元が総称関数となっていないといけないけど…)ということですね。

たまに基本的なことが不安になる…(ので確認していく)

追記

yutannihilationさんに教えていただきました。

そのものずばりが載ってる…!

S3 · Advanced R.

一回読んだはずなのに…。やはり読んでわかった気になっているのは危ないですね…。 精進あるのみ💪

Enjoy!!