First Thing's First
initialize() という特別な公開メソッドが 1 つあります(アメリカ英語の綴りに注意してください)。これはユーザーが直接呼び出すものではありません。代わりに、オブジェクトが作成されるとき、つまりユーザーが new() を呼び出したときに自動的に実行されます。
initialize() を使うと、R6 オブジェクトを作成するときに private フィールドの値を設定できます。initialize() 関数のパターンは次のとおりです。
thing_factory <- R6Class(
"Thing",
private = list(
a_field = "a value",
another_field = 123
),
public = list(
initialize = function(a_field, another_field) {
if(!missing(a_field)) {
private$a_field <- a_field
}
if(!missing(another_field)) {
private$another_field <- another_field
}
}
)
)
missing()(docs)の使い方に注目してください。これは、関数呼び出しで引数が渡されなかった場合に TRUE を返します。
ファクトリーの new() メソッドに渡された引数は、initialize() に渡されます。
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
この演習はコースの一部です
R における S3 と R6 を使ったオブジェクト指向プログラミング
演習の手順
電子レンジのファクトリーが一部まで定義されています。
initialize()という名前の公開メソッドを追加してください。これにより、オブジェクト作成時にpower_rating_wattsとdoor_is_openフィールドをユーザーが設定できるようにします。- 引数は
power_rating_wattsとdoor_is_openにしてください。 initialize()メソッドの本体では、各引数について、それがmissing()(docs)でなければ、対応する private フィールドを設定してください。
- 引数は
- 650 ワットの出力で、ドアが開いている電子レンジオブジェクトを作成してください。
microwave_oven_factoryのnew()メソッドを呼び出します。new()にpower_rating_watts = 650とdoor_is_open = TRUEを渡します。- 結果を
a_microwave_ovenに代入してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Add an initialize method
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
power_rating_watts = 800,
door_is_open = FALSE
),
public = list(
cook = function(time_seconds) {
Sys.sleep(time_seconds)
print("Your food is cooked!")
},
open_door = function() {
private$door_is_open <- TRUE
},
close_door = function() {
private$door_is_open <- FALSE
},
# Add initialize() method here
___ = ___(___, ___) {
if(!missing(power_rating_watts)) {
private$power_rating_watts <- power_rating_watts
}
___
}
)
)
# Make a microwave
a_microwave_oven <- ___