【问题标题】:R reference classes as a field of a reference classR 参考类作为参考类的一个字段
【发布时间】:2012-10-21 09:15:47
【问题描述】:

我想将引用类传递给引用类构造函数,并将传递的引用类分配为字段。但是,当我运行下面的代码时,我不明白为什么会出现错误。我的问题是:

1) 请有人解释一下为什么会出现这个错误:

> a <- ClassA&new()
Error in .getClassFromCache(Class, where) : 
  argument "Class" is missing, with no default
> b <- ClassB$new(a)
Error in .Object$initialize(...) : object 'a' not found

2) 我已将 class.a.container 声明为类“列表”,但我希望这是一个参考类。我需要在这里放什么而不是“列表”?

ClassA <- setRefClass(
  "ClassA",

  fields = list(myVar = "numeric"),

  methods = list(
    someMethod = function(){
      print("hi")
    }
  )
)

ClassB <- setRefClass(
  "ClassB",

  fields = list(class.a.container = "list"),

  methods = list(
    initialize = function(class.a){
      class.a.container <<- class.a
  })
)

a <- ClassA&new()
b <- ClassB$new(a)

【问题讨论】:

  • 我在 ClassA 定义中看不到任何“字段”参数。定义一个没有任何内容的类是否有意义?我只是问问。
  • 不是在现实生活中,这只是一个例子。为了清楚起见,我已经编辑了代码

标签: r oop reference-class


【解决方案1】:

你会觉得有点傻,至少当我注意到问题时是这样。在从环境类项中提取时,您有一个美元符号的和号。

a <- ClassA$new(myVar=1)
a$someMethod(2)
#[1] "hi

【讨论】:

    【解决方案2】:

    42- 已经指出了您的代码中的一个错误(& 而不是 $)。

    为了完全回答您的原始问题,我只想明确指出,在更正该错误后,您需要将 ClassB 中的字段声明从

    class.a.container = "list"
    

    到

    class.a.container = "ClassA"
    

    这是对我有用的完整代码:

    ClassA = setRefClass(
        Class = "ClassA",
    
        fields = list(myVar = "numeric"),
    
        methods = list(
            someMethod = function() {
                print("hi")
            }
        )
    )
    
    ClassB = setRefClass(
        Class = "ClassB",
    
        fields = list(class.a.container = "ClassA"),
    
        methods = list(
            initialize = function(class.a) {
                class.a.container <<- class.a
            }
        )
    )
    
    a = ClassA$new(myVar = 1)
    a
    
    b = ClassB$new(a)
    b
    

    打印出来:

    ...
    > a
    Reference class object of class "ClassA"
    Field "myVar":
    [1] 1
    > 
    > b = ClassB$new(a)
    > b
    Reference class object of class "ClassB"
    Field "class.a.container":
    Reference class object of class "ClassA"
    Field "myVar":
    [1] 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多