Menu
Coddy logo textTech

クラスを使ったリスト

CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 2/57。

S3は、Rで最も古く、最もよく使われているオブジェクトシステムです。S3オブジェクトは、class属性を持つ通常のリストです。これは、そのオブジェクトがどのような種類のものかを示すラベルです。class(x) <- "dog"でラベルを設定します。

rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)

出力:

[1] "dog"
Rex is 3

structure()は値を作成し、その属性を1回の呼び出しで設定します。これはS3オブジェクトを作成する通常の方法です。フィールドは、通常のリストと同じように$を使って読み取ります。

rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)

出力:

[1] "dog"
[1] TRUE
[1] 3

クラスは単なるラベルです。Rはオブジェクトがどのフィールドを持っているかをチェックしないため、どのリストでもdogと呼ぶことができます。unclass()はラベルを削除し、プレーンなリストを返します。

p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))

出力:

$x
[1] 1

$y
[1] 2

S3オブジェクトは値です。オブジェクトを変更する関数は自身のコピーを変更するため、新しいバージョンを返し、呼び出し元がそれを代入します。元のオブジェクトはそのままです:

birthday <- function(d) {
  d$age <- d$age + 1
  d
}
rex <- structure(list(name = "Rex", age = 3), class = "dog")
older <- birthday(rex)
cat(rex$age, older$age)

出力:

3 4
challenge icon

チャレンジ

簡単

Pet.R の make_pet(name, species, age) を完成させてください。これは、フィールド name、species、age をこの順序で持ち、クラスが pet であるリストを返します。次に、1つの文を返す describe_pet(p) を完成させてください。名前が Rex、種が dog、年齢が 3 のペットの場合、Rex is a 3 year old dog となります。

用意されたコードは名前、種、年齢を読み取り、ペットを作成して、そのクラス、フィールド名、文を出力します。

コードは Pet.R に記述します。main.R には用意された入出力コードが含まれており、編集できません。

自分で試してみよう

source("Pet.R")

# 提供された入出力コード: そのままにしておく
input <- suppressWarnings(readLines(file("stdin")))
p <- make_pet(input[1], input[2], as.numeric(input[3]))
cat("class: ", class(p), "\n", sep = "")
cat("fields: ", paste(names(p), collapse = ", "), "\n", sep = "")
cat(describe_pet(p), "\n", sep = "")
quiz icon腕試し

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

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

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