whichではwhich.minとwhich.maxが用意されているという指摘を受けたので調べ見てた。
which.minとwhich.maxはRでいうところのオブジェクト指向を利用した構造にみえる。クラスのメソッドを表示してくれるmethods()関数をwhichに適用してみると以下の結果になる。
> methods(which) [1] which.max which.min
この結果から2つのことがわかる。
- whichオブジェクトはそれ自体が関数であると同時にwhichオブジェクトとしてmaxとminのメソッドをもつ。
この点を確認するためにclass()でwhich, which.min, which.maxについて確認してみる。
> class(which) [1] "function" > class(which.min) [1] "function" > class(which.max) [1] "function"
上記よりすべては関数として定義されていることがわかる。ではオブジェクトとしてのwhichはどこになるのか。
Rではオブジェクトは大きく2つに分かれる。S3とS4である。S3はRでもっともよく使われているオブジェクト形式でありさまざまなオブジェクト(printやplot)で利用されている。Rでいうところのオブジェクト指向はポリモーフィズムである。plotはさまざまな型を受け入れて、グラフを描画することができる。methods()を使うと受け入れる型が表示される。
> methods(plot) [1] plot.acf* plot.correspondence* plot.data.frame* plot.decomposed.ts* plot.default plot.dendrogram* [7] plot.density plot.ecdf plot.factor* plot.formula* plot.function plot.ggplot* [13] plot.gtable* plot.hclust* plot.histogram* plot.HoltWinters* plot.isoreg* plot.Krig [19] plot.lda* plot.lm plot.mca* plot.medpolish* plot.mlm plot.ppr* [25] plot.prcomp* plot.princomp* plot.profile* plot.profile.nls* plot.qsreg plot.ridgelm* [31] plot.spam plot.spatial.design plot.spec plot.sreg plot.stepfun plot.stl* [37] plot.surface plot.table* plot.ts plot.tskernel* plot.TukeyHSD plot.vgram.matrix
S3オブジェクトはclass名とdispatch機能からなりたつ。パラメータを受け取るとその型に合ったメソッドを呼び出す。これはdispatch機能が実行している。plotやprintなどポリモーフィズムを取り扱う関数をgeneric functionと呼んでいる。つまりobject本体があるというよりもdispatchするための関数があると考えるほうがわかりやすい。
さてwhich()についてmethods()の結果を見ると以下のようになっている。
> methods(which) [1] which.max which.min 警告メッセージ: In methods(which) : 関数 'which' は総称的では無いようです
whichはprintやplotとはことなりdispatchができないと考えられる。whichという関数にさらにmaxとminという関数を紐付けただだ。
これをソースから見てみる。
> plot
function (x, y, ...)
UseMethod("plot")
<bytecode: 0x000000002188e278>
<environment: namespace:graphics>
plot()はコードとしては一行であり UseMethodのみである。このUseMethodによりdispatchされている。
Printの結果は以下のようになっている。
> print
standardGeneric for "print" defined from package "base"
function (x, ...)
standardGeneric("print")
<environment: 0x00000000107010b8>
Methods may be defined for arguments: x
Use showMethods("print") for currently available ones.
こちらも一行であり、standardGenericとなっている。UseMethodはS3におけるgeneric functionの定義方法であり、standardGenericはS4における定義方法という違いがある。
これに対してwhich()は以下のようになっておりdispatchができない。
> which
function (x, arr.ind = FALSE, useNames = TRUE)
{
wh <- .Internal(which(x))
if (arr.ind && !is.null(d <- dim(x)))
arrayInd(wh, d, dimnames(x), useNames = useNames)
else wh
}
<bytecode: 0x0000000006caeae8>
<environment: namespace:base>
そのためwhich.minとwhich.maxは能動的に呼び出す必要がある。
参考
- データ解析言語Rによる統計的プログラミング: 第 3 回 再利用可能なオブジェクト指向プログラミング
- Going from S3 to S4 object oriented programming in [R]
- A brief Introduction to object- oriented programming in R
![]() |
|
新品価格 |
![]()
