更改R6类的子类中的initialize方法

Tom*_*mmy 9 r r6

假设我有一个R6类Person:

library(R6)

Person <- R6Class("Person",
  public = list(name = NA, hair = NA,
                initialize = function(name, hair) {
                  self$name <- name
                  self$hair <- hair
                  self$greet()
                },
                greet = function() {
                  cat("Hello, my name is ", self$name, ".\n", sep = "")
                })
)
Run Code Online (Sandbox Code Playgroud)

如果我想创建一个子类,其initialize方法应该是相同的,除了添加一个变量,self我将如何做到这一点?
我尝试了以下方法:

PersonWithSurname <- R6Class("PersonWithSurname",
  inherit = Person,
  public = list(surname = NA,
                initialize = function(name, surname, hair) {
                  Person$new(name, hair)
                  self$surname <- surname
                })
)
Run Code Online (Sandbox Code Playgroud)

然而,当我创建类的新实例PersonWithSurname字段name和hair为NA,即类的默认值Person.

PersonWithSurname$new("John", "Doe", "brown")
Hello, my name is John.
<PersonWithSurname>
   Inherits from: <Person>
   Public:
     clone: function (deep = FALSE) 
     greet: function () 
     hair: NA
     initialize: function (name, surname, hair) 
     name: NA
     surname: Doe
Run Code Online (Sandbox Code Playgroud)

在Python我将做到以下几点:

class Person(object):
  def __init__(self, name, hair):
    self.name = name
    self.hair = hair
    self.greet()

  def greet(self):
    print "Hello, my name is " + self.name

class PersonWithSurname(Person):
  def __init__(self, name, surname, hair):
    Person.__init__(self, name, hair)
    self.surname = surname
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 15

在这方面,R6的工作方式与Python非常相似; 也就是说,你只需要调用initialize该super对象:

PersonWithSurname <- R6Class("PersonWithSurname",
  inherit = Person,
  public = list(surname = NA,
                initialize = function(name, surname, hair) {
                  super$initialize(name, hair)
                  self$surname <- surname
                })
)
Run Code Online (Sandbox Code Playgroud)

  • @Tommy确实,文档在这方面有点缺乏,但是[简介小插图](https://cran.r-project.org/web/packages/R6/vignettes/Introduction.html)提到了`super`至少,尽管它没有具体解释超类初始化。该行为可以从 R6 的(重要)实现中猜测出来。此外,这些项目包含显示此行为的[测试用例](https://github.com/wch/R6/blob/f6cb021a5da2581aebda1d49afd872cd80967479/tests/testthat/test-nonportable-inheritance.R#L35)。 (3认同)