向R6子类添加方法

Tutuchan

我开始为工作中的项目修改R6,但我无法理解以下行为。

假设我定义了一个超类Person和一个子类PersonWithAge

Person <- R6Class("Person",
                  public = list(
                    name = NA,
                    hair = NA,
                    initialize = function(name, hair) {
                      if (!missing(name)) self$name <- name
                      if (!missing(hair)) self$hair <- hair
                      self$greet()
                    },
                    set_hair = function(val) {
                      self$hair <- val
                    },
                    greet = function() {
                      cat(paste0("Hello, my name is ", self$name, ".\n"))
                    }
                  )
)
PersonWithAge <- R6Class("PersonWithAge",
                       inherit = Person,
                       public = list(
                         age = NA))

如果我尝试向子类添加新方法,则会PersonWithAge出现以下错误:

> PersonWithAge$set("public", "set_age", function(age) self$age <<- age)
Error in self[[group]][[name]] <- value : 
  invalid type/length (closure/0) in vector allocation

现在,如果我使用虚拟方法定义了一个新的子类,则可以毫无问题地将新方法添加到该子类中:

PersonWithHeight <- R6Class("PersonWithHeight",
                         inherit = Person,
                         public = list(
                           height = NA,
                           foo = function() print(1)
                           ))
PersonWithHeight$set("public", "set_height", function(height) self$height <<- height)
> caitlin <- PersonWithHeight$new("Caitlin", "auburn")
Hello, my name is Caitlin.
> caitlin$set_height(165)
> caitlin
<PersonWithHeight>
  Public:
    foo: function
    greet: function
    hair: auburn
    height: 165
    initialize: function
    name: Caitlin
    set_hair: function
    set_height: function

我尝试更改类定义中lock参数,R6Class但无济于事。会话信息是:

> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252    LC_MONETARY=French_France.1252 LC_NUMERIC=C                  
[5] LC_TIME=French_France.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] R6_2.0.1

loaded via a namespace (and not attached):
[1] tools_3.1.1

在此会话信息的另一台计算机上,我也得到了相同的行为:

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C         LC_TIME=C            LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C       
 [7] LC_PAPER=C           LC_NAME=C            LC_ADDRESS=C         LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] R6_2.0.1

loaded via a namespace (and not attached):
[1] tools_3.1.2

我的问题如下:

  1. 我是否缺少某些东西?这是正常的预期行为吗?在那种情况下,为什么呢?
  2. 只要我在这里:据我了解,R6中是否没有虚拟类和抽象方法的真正实现?

编辑:好的,在查看了程序包的源代码之后,我意识到,在这一行:

self[[group]][[name]] <- value

group是一个public_methodsprivate_methodspublic_fieldsprivate_fields因此,我猜想在创建没有任何公共方法的类时,由于该组实际上不存在,因此向该类添加新的公共方法失败。

Tutuchan

我设法解决了这个问题,方法是从Winston Chang的仓库中提取源代码并修改get_functionsget_nonfunctions函数,utils.R以使它们返回一个空列表,而不是NULL在找不到任何函数(分别是非函数)的情况下。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R:如何重载+运算符来调用向R6类添加函数的方法?

来自分类Dev

动态向r6类实例添加函数

来自分类Dev

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

来自分类Dev

R6类中的静态方法

来自分类Dev

R,R6,公开方法的形式

来自分类Dev

R R6类和UseMethod /泛型方法

来自分类Dev

R,R6,公开方法的形式

来自分类Dev

Javascript为什么不能向子类原型添加方法?

来自分类Dev

在R中的R6类中测试私有方法

来自分类Dev

在R中的R6类中测试私有方法

来自分类Dev

定义调用R6对象之外的其他方法的方法

来自分类Dev

使用R6高效创建对象

来自分类Dev

在R6类上实现S3调度的正确方法

来自分类Dev

如何在R6对象中调度summary()方法

来自分类Dev

R6初始化内的R6类的调用函数

来自分类Dev

使用纯 JS 向子类添加属性

来自分类Dev

是否可以向NSManagedObject的子类的子类添加属性?

来自分类Dev

在Perl6中向SetHash添加元素的方法

来自分类Dev

向 ES6 类添加变量方法

来自分类Dev

在 R 包中包含 R6 类对象

来自分类Dev

有没有办法使用它自己的方法删除R6对象?

来自分类Dev

从R6类访问包范围的变量

来自分类Dev

如何告诉R6类如何使用方括号?

来自分类Dev

R6类内部定义:“未找到对象”(或:如何在R6类中定义“本地”对象)

来自分类Dev

向对象添加方法

来自分类Dev

向功能添加方法

来自分类Dev

向功能添加方法

来自分类Dev

向类添加方法

来自分类Dev

向R中的嵌套列表添加变量的优雅方法