2016-03-10 63 views
4

比方说,我有一个R6类Person变化的R6类的子类初始化方法

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 = "") 
       }) 
) 

如果我想创建一个子类,其initialize方法应该是一样的,除了加入多一个变量来self我将如何做到这一点?
我试过如下:

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

然而,当我创建PersonWithSurname类中的字段namehairNA的新实例,即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 

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 
+0

其实在Python,你应该使用'超()',而不是父类的名字。这可以防止错误。 –

回答

8

R6工作方式非常像Python在这方面;也就是说,你只需要调用initializesuper对象:

PersonWithSurname <- R6Class("PersonWithSurname", 
    inherit = Person, 
    public = list(surname = NA, 
       initialize = function(name, surname, hair) { 
        super$initialize(name, hair) 
        self$surname <- surname 
       }) 
) 
+0

这是记录在任何地方吗?我无法在短片中找到有关“超级”的任何内容。 – Tommy

+0

@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),它们显示了此行为。 –