2016-03-10 62 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),它們顯示了此行爲。 –