始める無料で始める

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_wattsdoor_is_open フィールドをユーザーが設定できるようにします。
    • 引数は power_rating_wattsdoor_is_open にしてください。
    • initialize() メソッドの本体では、各引数について、それが missing()docs)でなければ、対応する private フィールドを設定してください。
  • 650 ワットの出力で、ドアが開いている電子レンジオブジェクトを作成してください。
    • microwave_oven_factorynew() メソッドを呼び出します。
    • new()power_rating_watts = 650door_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 <- ___
コードを編集して実行