開始使用免費開始

先做最重要的事

有一個特殊的 public 方法叫做 initialize()(注意美式英文拼法)。使用者不會直接呼叫它。當建立物件時會自動呼叫它;也就是使用者呼叫 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()說明文件)的用法。若在函式呼叫中沒有傳入某個引數,它會回傳 TRUE

工廠的 new() 方法所接收的引數會傳遞給 initialize()

a_thing <- thing_factory$new(
  a_field = "a different value", 
  another_field = 456
)

本練習屬於課程

在 R 中使用 S3 與 R6 的物件導向程式設計

檢視課程

練習說明

已為你部分定義了一個微波爐工廠。

  • 新增一個名為 initialize() 的 public 方法。這應該允許使用者在建立物件時設定 power_rating_wattsdoor_is_open 欄位。
    • 引數應為 power_rating_wattsdoor_is_open
    • initialize() 方法的主體中,對每個引數,如果不是 missing()說明文件),就設定對應的 private 欄位。
  • 建立一個功率為 650 瓦且門是開啟的微波爐物件。
    • 呼叫 microwave_oven_factorynew() 方法。
    • 將引數 power_rating_watts = 650door_is_open = TRUE 傳給 new()
    • 把結果指定給 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 <- ___
編輯並執行程式碼