科学の箱

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

ジニ係数(再掲)

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

no image

大気汚染データの観測

コーセラのDeveloping Data Productで知りたい場所の緯度経度を入力すると過去の観測データからオゾン濃度とPM25汚染濃度を予測するコードを紹介していた。Video Lectureの …

no image

与えられたパラメータにもっとも近い値を探す

ベクトルからパラメータにもっとも近い値を探す方法 >  x <- 1:10 >  num <- which( abs(x-5.2) == min(abs(x-5.2)) ) & …

no image

クラスタリング

Rによるクラスタ分析の実行 県別の持家率と自家用車普及率からクラスタ分析を実行し似た県を探してみる。。 データソース 持家と自家用車普及率のデータは下記から取得する 持家普及率のデータはこちらから取得 …

no image

splineを利用する

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

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

side bar top



アーカイブ

カテゴリー