Menu
CoddyTech

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 36

setClass() はジェネレーター関数も返します。名前(通常はクラス名)に代入し、コンストラクターのように呼び出します。

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] TRUE

S3とは異なり、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
challenge icon

チャレンジ

簡単

Book.RでS4クラスBookを宣言し、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 = "")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rオンラインコンパイラ