【问题标题】:R: Fields in Reference Classes of type Reference ClassR:引用类类型的引用类中的字段
【发布时间】:2016-03-21 17:04:10
【问题描述】:

我有一个引用类,我想将它用作另一个引用类中的对象。示例:

class_1 <- setRefClass( Class = "class_1"
    , fields = list(nickname = "character", version = "character" )
    , methods = list(
      initializer = function(nickname, version) {
        nickname <<- nickname
        version <<- version
      }
    )
)

class_2 <- setRefClass( Class = "class_2"
    , fields = c( version = "character"
                  , nickname = "character"
                  , class_1_item = "class_1" )
    , methods = list(
      initializer = function(class_2_nickname = "B", class_2_version = "V2") {
        class_1_item <<- class_1$new(class_2_nickname, class_1_version)
        nickname <<- class_2_nickname
        version <<- class_2_version
      }
    )

)

#######

class_2_obj <- class_2$new(nickname = "A", version = "V1")

class_1_obj <- class_1$new(nickname = "A", version = "V1")

class_2_obj2 <- class_2$new()

当我在注释标记之后调用第一行时,它会创建一个 class_2 对象,其中包含一个 class_1 对象,但它从未将字段初始化为对象 class_1_item,该对象的构造函数作为第一行的一部分被调用。然而,当我直接在第 2 行(在类 2 构造函数之外)调用构造函数时,它初始化这些字段就好了。最后,当我在第 3 行不带参数调用构造函数时,它甚至不会获取默认参数,而是将所有内容都保留为空。

我觉得 R 类有一些基本的东西,使它们与我没有得到的 C/Python/Java 类完全不同。当我将赋值运算符与 $setRefClass()$ 一起使用时,我不明白对象“class_1”指的是什么对象。另外,我觉得我不明白在什么情况下“

我错过了什么?

【问题讨论】:

    标签: r oop reference-class


    【解决方案1】:

    S4 引用类的初始化过程一直让我很困惑,所以可能有更好的解决方案。您必须使用&lt;&lt;- 而不是&lt;-,因为 normal 赋值运算符只会进行本地赋值 - 对于您的 init 方法来说是本地的。但是,您希望替换对象中的字段,这些字段位于为您的对象定义的任何方法的封闭环境中。要在封闭环境中进行分配,您需要&lt;&lt;-。另一种方法是使用.self,我将其用于下面的说明——据我所知,除了偏好之外没有其他区别。

    我还修改了您的示例,使初始化过程符合您的期望。 setRefClass 函数的初始化部分可能值得一读。我不了解您定义的 initializer 方法与 initialize 方法相比有何作用,但我相信您真正想要的是后者。此外,我无法理解您所指的 class_1_version 对象,但似乎没有任何定义。但无论如何,我希望以下内容有所帮助。

    class_1 <- setRefClass( 
        Class = "class_1", 
        fields = list(nickname = "character", version = "character" ), 
        methods = list(
            initialize=function(nickname = NA_character_, version = NA_character_) {
                .self$nickname <- nickname
                .self$version <- version
            }
        )
    )
    
    class_2 <- setRefClass(
        Class = "class_2", 
        fields = c(
            version = "character", 
            nickname = "character", 
            class_1_item = "class_1"
        ), 
        methods = list(
            initialize=function(nickname = NA_character_, version = NA_character_) {
                .self$class_1_item <- class_1$new(nickname, version)
                .self$nickname <- nickname
                .self$version <- version
            }
        )
    )
    

    【讨论】:

    • 谢谢!那肯定是一个错字,那么 -- $initializer$ 应该是 $initialize$。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多