S4クラスの定義
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 22/57。
S4はRの正式なオブジェクトシステムです。setClass()は名前付きスロットと、それぞれの型を持つクラスを宣言し、new()はオブジェクトを作成します。@演算子はスロットを読み取ります:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)出力:
Ada is 36setClass()はジェネレーター関数も返します。通常はクラス名である名前に割り当て、コンストラクターのように呼び出します:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))出力:
[1] 8
[1] TRUES3 とは異なり、R はスロットをチェックします。未知のスロットや誤った型の値があると、new() はエラーで停止するため、S4 オブジェクトは常にクラスが宣言した形状になります。
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")出力:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution halted値が指定されていないスロットには、character(0) のように、その型の空の値が設定されます。prototype を使うと、代わりに実際のデフォルト値を設定できます。古いコードでは、representation() を使ってスロットを宣言しています。これは slots と同じ意味です。
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))出力:
[1] FALSE
[1] 0チャレンジ
簡単Book クラスを Book.R で宣言し、3 つのスロットを定義してください。title と author の型は character、pages の型は numeric とします。次に、@ を使ってスロットを読み取り、Dune by Frank Herbert (412 pages) を返す book_label(b) を完成させてください。
用意されているコードは title;author;pages の形式の行を読み取り、new("Book", ...) で各書籍を作成し、そのラベルを出力して、最後にクラスのスロット名を出力します。
コードは Book.R に記述してください。main.R には用意されている入出力コードが含まれており、編集できません。
自分で試してみよう
source("Book.R")
# 提供された入出力コード: そのままにしておく
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\n", sep = "")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ