科学の箱

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

分散分析のcase study-2

分散分析のcase study-1からの続き。 さて前回まででとりあえずデータの簡単な分析を終えて、以下のような結論を得た。 図1よりR1とR2を比較するとスピードはR1のほうが常に上である。またS1 …

no image

回帰分析

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

no image

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

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

no image

splineを利用する

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

no image

R – ElemStatLearn – Coutries

データの概要 国ごとの相違を距離で表しているクロス表 > dim(countries) [1] 12 12 > names(countries) NULL > str(countri …

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

side bar top



アーカイブ

カテゴリー