Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R6类的子类中更改initialize方法_R_R6 - Fatal编程技术网

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

在R6类的子类中更改initialize方法,r,r6,R,R6,假设我有一个R6类人: library(R6) Person <- R6Class("Person", public = list(name = NA, hair = NA, initialize = function(name, hair) { self$name <- name self$hair <- hair self$gre

假设我有一个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 = "")
                })
)
但是,当我用urname创建class
persons的新实例时,
name
hair
字段是
NA
,即class
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

R6在这方面与Python非常相似;也就是说,您只需在
super
对象上调用
initialize

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

PersonWithUrName实际上在Python中应该使用
super()
,而不是父类的名称。这可以防止错误。这有记录在案的地方吗?我在小插曲中找不到任何关于
super
的内容。@Tommy确实,文档在这方面有点欠缺,但至少提到了
super
,尽管它没有具体解释超类初始化。这种行为可以从R6的(非平凡的)实现中猜测出来。此外,项目包含显示此行为的项目。更新的链接指向。
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
PersonWithSurname <- R6Class("PersonWithSurname",
  inherit = Person,
  public = list(surname = NA,
                initialize = function(name, surname, hair) {
                  super$initialize(name, hair)
                  self$surname <- surname
                })
)