我遇到了一些我想解决的 R 引用类的行为。在下面的代码中,引用类 B 中有引用类 A 的两个字段。

B 中的这些字段似乎在调用 B 的 initialize() 方法之前使用引用类 A 的零参数(默认)版本实例化(可能两次)。然后在 B 的初始化过程中,这些实例被替换为实例 A 的正确版本。问题是,如果我使用 B 的实例生成器中的 lock(),则无法在 B 中替换 A 的初始空实例化。另一个问题是引用类 A 在 initialize [或缺失(c)测试] 中需要一个默认值。

帮助 - 建议 - 等表示赞赏。

A <- setRefClass('A',
    fields = list(
        count = 'numeric'
    ),

    methods = list(
        initialize = function (c=0) {
            cat('DEBUG: A$initialize(c); where c=');  cat(c); cat('\n')
            count <<- c
        }
    )
)

instance.of.A <- A$new(10)
str(instance.of.A)

B <- setRefClass('B',
    field = list(
        a = 'A',
        b = 'A'
    ),

    methods = list(
        initialize = function(c) {
            a <<- instance.of.A
            b <<- getRefClass('A')$new(c)
        }
    )
)

instance.of.b <- B$new(100)
str(instance.of.b)

最佳答案

以下是两种可能的解决方案:

  • 不要设置字段属性:
    B <- setRefClass('B',
        methods = list(
            initialize = function(c) {
              .self$a = instance.of.A
              .self$b =getRefClass('A')$new(c)
            }
         )
     )
    
  • 设置字段,但使用 ANY 类:
    B <- setRefClass('B',
        field = (a="ANY", b="ANY"),
        methods = list(
            initialize = function(c) {
              a <<- instance.of.A
              b <<- getRefClass('A')$new(c)
            }
         )
     )
    

  • 这两种解决方案的缺点是类型没有在 ab 中强制执行,即
     B$a = "Fred"
    

    现在是可能的。

    关于r - 引用类中引用类的实例化 - lock() 和不变性问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13115913/

    10-12 18:53