科学の箱

科学・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

oneway.test, aov, anovaの違い

RではANOVAを実行する際にoneway.test, aov, anovaを利用できる。違いが判らない。調べてみるとなんかややこしそうなのでとりあえず資料だけ集めてみた。 ONEWAY BETWEE …

no image

回帰分析

回帰分析の手順 データを取得する。 回帰分析をする意味があるかを検討する 回帰分析のモデルを検討する 回帰分析をする 回帰分析の結果について考察する 回帰分析のメモ 回帰分析では目的変数を説明できる変 …

no image

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

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

no image

Rでグラフを作成するときに参考にするサイト

金子 邦彦 研究室 Web ページ バイオスタティスティクス 奥村 晴彦研究室 Related posts:conjoint分析の資料一対比較法によるリーグ戦の分析サンプルサイズによる有意の違い

no image

ジニ係数(再掲)

ジニ係数について修正した。とりあえずコード。 revenue<-read.csv(file=”data.csv”, head=TRUE) revenue$TotalRevenues_n < …

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

side bar top



アーカイブ

カテゴリー