我遇到了一些我想解决的 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)
}
)
)
这两种解决方案的缺点是类型没有在
a
和 b
中强制执行,即 B$a = "Fred"
现在是可能的。
关于r - 引用类中引用类的实例化 - lock() 和不变性问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13115913/