4

我目前正在为需要时间来生产的大型对象开发参考类 (R5),我想知道是否有人知道比使用 setRefClass 重新定义类并在每次更新方法时重现对象更好的方法来开发方法。

换句话说:可以重新定义现有 Reference 类对象的方法吗?

4

2 回答 2

2

我曾考虑过执行以下操作:

test <- setRefClass("TEST",
              fields = list(a = "numeric"),
              methods = list(
                        funA = function(){
                                      a <<- a+1
                                     },
                        initialize = function(){
                                          a <<- 1
                                          callSuper()
                                         }
                        )
)

ex1 <- test$new()

ex1$funA()

test$methods(funA = function(){
                      a <<- a+10
                     }
            )

ex$funA
# Class method definition for method funA()
# function () 
# {
#     a <<- a + 1
# }
# <environment: 0x0537f8ac>

ex1 <- test$new()$import(ex1)

ex$funA
# Class method definition for method funA()
# function () 
# {
#     a <<- a + 10
# }
# <environment: 0x04badc5c>

我相信您可以使用 覆盖类中的先前方法class$methods(,然后您可以从重新定义的类中设置一个新对象并导入旧对象。我会注意:

“类的所有方法都应该在定义类的源代码中定义,通常作为包的一部分。特别是,不能在带有命名空间的附加包中的类中重新定义方法:类方法检查类定义的锁定绑定。” 从?setRefClass也。

于 2012-09-29T04:26:38.170 回答
2

这个问题困扰了我好几个月。今天我发现了一个非常方便的解决方案,灵感来自https://stat.ethz.ch/pipermail/r-help/2012-January/299743.html

让我们从一个有错误实现的 ReferenceClass 开始:

MyClass <- setRefClass(
  "MyClass",
  fields = list(
    xy = "data.frame"
  ),
  methods = list(
    initialize = function( df ){
      if( !missing( df ) ){
        xy <<- df
      }
    },
    getSecondRow = function(){
      # A mistake happend here
      return( xy[1,] )
    }
  )
)

mc <- MyClass$new( data.frame( a = 1:10, b = rnorm(10) ) )
mc$getSecondRow()

  a         b
1 1 0.1349983

的实施getSecondRow显然没有提供预期的结果。所以固定方法实际上应该看起来像

    getSecondRow = function(){
      return( xy[2,] )
    }

没有显式实现构造函数的类

使用默认构造函数的复制构造函数功能,而不是加载类并从头开始复制对象的技巧是从现有对象构造一个新对象initialize( ... )。调试并重新加载类后,您只需将具有实现的现有对象复制到同一个变量中

# NOTRUN
mc <- MyClass$new( mc )

具有重写构造函数的类。

但是,在这里介绍的情况下,标准构造函数已经被覆盖。但是在这种情况下,您可以简单地使用这样的功能callSuper( ... ),您的构造函数应该看起来像

    initialize = function( df, ... ){
      callSuper( ... )
      if( !missing( df ) ){
        xy <<- df
      }
    }

最后,您的固定对象是由

mc <- MyClass$new( mc$xy, mc )
mc$getSecondRow()

  a         b
2 2 0.8452587
于 2013-05-15T15:34:59.943 回答