「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。目下、データ分析・語学に力点を置いています。今月(2022年10月)からは多忙につき、日々の投稿数を減らします。

MENU

プログラムとしてのRを学ぶ(その09/16)

 \mathrm{R}をプログラムとして見たときに注意・検討すべきところを学んでおきたい、ということで

を読んでいく。

9. オブジェクト指向プログラミング

 オブジェクト指向プログラミング(\mathrm{OOP})は分かりやすく再利用しやすいコードを書くのに役立つ。

  • \mathrm{R}で扱うものはすべてオブジェクトである
  • \mathrm{R}カプセル化を促進する
  • \mathrm{R}のクラスは多態的で、同じ関数呼び出しでもオブジェクトのクラスが異なると異なる演算になる
  • \mathrm{R}は継承を認めている

9.1 S3クラス

 初期の\mathrm{R}クラス構造である\mathrm{S3}クラスは依然として\mathrm{R}において主要なクラスパラダイムである。
 \mathrm{S3}クラスはリストで構成され、クラス名属性とディスパッチ構造が付いている。ディスパッチ機能により、ジェネリック関数が利用できるようになっている。

9.1.1 S3ジェネリック関数

 既述したとおり\mathrm{R}では多態的に様々な種類のオブジェクトにある関数(たとえば\mathrm{plot}())を適用できる。多態的な関数をジェネリック関数という。

9.1.2 ジェネリックメソッドの実装を探す

 \mathrm{methods}()関数を用いると、あるジェネリックメソッドのすべての実装が分かる。

9.1.3 S3クラスの記述

 \mathrm{S3}クラスのクラスインスタンスはリストを形成して作成し、リスト成分はそのクラスのメンバ変数である。

####################
### S3クラスの例 ###
####################

# 例:従業員クラスの定義
j <- list(name = "Joe", salary = 55000, union = T)
class(j) <- "employee"

attributes(j)

# 継承:上の従業員クラスのサブクラスを定義
k <- list(name = "Kate", salary = 68000, union = T, hrsthismonth = 2)
class(k) <- c("hrlyemployee", "employee")

k

9.2 S4クラス

 上述の従業員クラスでは、

  • 組合員状態(\mathrm{union})を入れ忘れる
  • \mathrm{union}をスペルミスする
  • 他のクラスのオブジェクトを誤って\mathrm{employee}属性にする

といったミスが生じ得る。このような\mathrm{S3}において生じ得る問題を避けるべく\mathrm{S4}クラスは開発された。

操作 S3 S4
クラスの定義 コンストラクタコード内で暗黙的 \mathrm{SetClass()}
オブジェクト生成 リストの作成、

クラス属性の設定
\mathrm{new()}
メンバ変数の参照 \mathrm{$} \mathrm{@}
ジェネリック\mathrm{f()}の生成 \mathrm{f.classname()}の定義 \mathrm{setMethod()}
ジェネリックの宣言 \mathrm{UseMethod()} \mathrm{setGeneric()}
####################
### S4クラスの例 ###
####################

# S4クラスの定義
setClass("employee",
         representation(
           name = "character",
           salary = "numeric",
           union = "logical"
         ))

joe <- new(Class = "employee", name = "Joe",salary = 55000, union = T)

# S4のスロットへのアクセス
joe@name

# ジェネリック関数show()を定義
setMethod(f = "show", signature = "employee",definition = function(object){
  inorout <- ifelse(object@union, "is","is not")
  cat(object@name, "has a salary of",object@salary,"and",inorout,"in the union","\n")
})

show(joe)

9.3 オブジェクトの管理

関数 機能
\mathrm{ls}() 現在のオブジェクトをすべて列挙
\mathrm{rm}() 引数として与えたオブジェクトをすべて削除する

引数\mathrm{pattern}にはワイルドカードが使え、その文字列を含むオブジェクトすべてを削除できる
\mathrm{rm(list = ls())} 全オブジェクトを削除する
\mathrm{save}() ディスクに引数として与えたオブジェクトを保存する
\mathrm{typeof}() オブジェクトのタイプを返す
\mathrm{class}() オブジェクトのクラスを返す
\mathrm{mode}() オブジェクトのモードを返す
\mathrm{names}() 要素に命名する
\mathrm{attributes}() オブジェクトに付与されている属性を確認する
\mathrm{unclass}() 引数からクラス属性を除いたものを返す
\mathrm{str}() データ構造を返す
\mathrm{exists}() 引用符付きの引数がオブジェクトとして存在するかを返す
プライバシーポリシー お問い合わせ