科学の箱

科学・IT・登山の話題

R

Rオブジェクト指向のメモ

投稿日:

whichではwhich.minとwhich.maxが用意されているという指摘を受けたので調べ見てた。

which.minとwhich.maxはRでいうところのオブジェクト指向を利用した構造にみえる。クラスのメソッドを表示してくれるmethods()関数をwhichに適用してみると以下の結果になる。

> methods(which)
[1] which.max which.min

この結果から2つのことがわかる。

  1. 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,456から
(2014/6/12 16:40時点)

 

メタ情報

inarticle



メタ情報

inarticle



-R
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

data.frameについて注意すること

以前predict()について検証を進めていた際に、不可解なエラーが出てしまい、途中で調査をやめてしまったことがあった。 具体的なエラーは以下である。 > newGalton$child &lt …

no image

splineを利用する

データが連続していない時には、となりあうデータを使ってその間の値を予測できる。簡単な例では1と2という値があり、この間を一つの値で補完すると1.5となる。補間する値を増やしていけば滑らかな曲線になる。 …

no image

主成分分析

Rで提供されているirisを使って主成分分析を実施する。 主成分分析の手順 データが分離できるか検証する 主成分負荷量と寄与率を求める 新しい変数に名前を付ける 変量プロット 主成分プロット 今回はR …

no image

Rでのランダムデータ作成 – 上級編

平均が異なるランダムデータを作成する > x <- rnorm(12, mean=rep(1:3,each=4), sd=0.2) > y <- rnorm(12, mean= …

no image

Rでのランダムデータ作成 – 上級編 (改)

Rでのランダムデータ作成 – 上級編にコメントをいただいたので調べてみた。結果を対比するためにプロットも入れた。 まずデータフレームを使う方法が以下である。 lm1 <- lm(galton$c …

2014年6月
« 5月   7月 »
 1
2345678
9101112131415
16171819202122
23242526272829
30  

side bar top



アーカイブ

カテゴリー