开始使用免费开始使用

先从初始化开始

有一个特殊的公共方法名为 initialize()(注意是美式拼写)。用户不会直接调用它。它会在创建对象时自动调用;也就是说,当用户调用 new() 时触发。

initialize() 允许您在创建 R6 对象时设置私有字段的值。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() 的公共方法。这应允许用户在创建对象时设置 power_rating_wattsdoor_is_open 字段。
    • 参数应为 power_rating_wattsdoor_is_open
    • initialize() 方法体内,对每个参数,如果它不是 missing()文档),则应设置对应的私有字段。
  • 创建一个功率为 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 <- ___
编辑并运行代码