科学の箱

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

rvestで読み込むcssを調べる方法

rvestで対象とするhtmlのブロックは下記のように取得できる。 http://blog.rstudio.com/2014/11/24/rvest-easy-web-scraping-with-r/ …

no image

Rによるやさしい統計学/3-2つの変数の記述統計

散布図を作成 Rで散布図を作成する。データはrunifで10個ずつ作成する。データのレンジは50~100. x_test <- as.integer(runif(10, 50, 100)) y_ …

no image

データフレームで層別に操作をする

Rでデータベースに似たデータを取り扱う際には、データフレームを使うことがおおい。JavaはPHPなどのプログラミング言語では、層別に集計作業をする際にはデータベース上のSQLか、データを読み込んでから …

no image

dataanalysis-002-week4

クラスタリング SVDと組み合わせることでよりクラスに分かれているクラスタリングを実行できる。 散布図でクラスタリングする変数を探す クラスタリング SVDを実行する SVDの結果をクラスタリングに取 …

no image

oneway.test, aov, anovaの違い-2

さてoneway.test, aov, anovaの違いをもとにしてそれぞれの関数について調べてみる。 機能 advantage disadvantage oneway.test 分散分析 等分散を仮 …

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

side bar top



アーカイブ

カテゴリー