R 参考 Class:具有活动绑定的复制方法
R Reference Class: copy method with active bindings
如果你有一个活动绑定,复制方法似乎不起作用。
示例class:
test <- setRefClass("test", fields = list(x =function() y + 1 , y = "numeric"))
正在初始化,一切正常:
a <- test(y = 1)
a$x
[1] 2
a$y
[1] 1
复制错误:
a$copy()
Error in (function () : unused argument (quote(2))
这是预期的行为吗?
R.version
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 1.2
year 2014
month 10
day 31
svn rev 66913
language R
version.string R version 3.1.2 (2014-10-31)
nickname Pumpkin Helmet
根据 Martin 的评论,问题出在默认 copy
方法的 assign()
部分:
for (field in names(def@fieldClasses)) {
if (shallow)
assign(field, get(field, envir = selfEnv), envir = vEnv)
else {
current <- get(field, envir = selfEnv)
if (is(current, "envRefClass"))
current <- current$copy(FALSE)
assign(field, current, envir = vEnv)
}
}
由于该字段是一个没有参数的活动绑定,分配将失败。一个简单的解决方案似乎是为所有活动绑定提供参数。在我的例子中,我使用了三个点。
test <- setRefClass("test", fields = list(x = function(...) y + 1 , y = "numeric"))
现在复制方法可以正常工作了。但是如果您尝试将值分配给活动绑定,该函数不会抛出错误(有时这是我在用例中需要的东西)。
所以我尝试的另一个解决方案是重新定义复制方法,只对那些不是活动绑定的字段执行 for 循环:
test <- setRefClass("test", fields = list( x = function() y + 1, y = "numeric"))
test$methods(copy = function (shallow = FALSE)
{
def <- .refClassDef
value <- new(def)
vEnv <- as.environment(value)
selfEnv <- as.environment(.self)
fields <- names(def@fieldClasses)[def@fieldClasses!= "activeBindingFunction"]
for (field in fields) {
if (shallow)
assign(field, get(field, envir = selfEnv), envir = vEnv)
else {
current <- get(field, envir = selfEnv)
if (is(current, "envRefClass"))
current <- current$copy(FALSE)
assign(field, current, envir = vEnv)
}
}
value
}
)
在我测试过的情况下似乎工作正常。不过我还没有彻底测试过,所以我不知道在其他情况下它是否会崩溃。
如果你有一个活动绑定,复制方法似乎不起作用。
示例class:
test <- setRefClass("test", fields = list(x =function() y + 1 , y = "numeric"))
正在初始化,一切正常:
a <- test(y = 1)
a$x
[1] 2
a$y
[1] 1
复制错误:
a$copy()
Error in (function () : unused argument (quote(2))
这是预期的行为吗?
R.version
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 1.2
year 2014
month 10
day 31
svn rev 66913
language R
version.string R version 3.1.2 (2014-10-31)
nickname Pumpkin Helmet
根据 Martin 的评论,问题出在默认 copy
方法的 assign()
部分:
for (field in names(def@fieldClasses)) {
if (shallow)
assign(field, get(field, envir = selfEnv), envir = vEnv)
else {
current <- get(field, envir = selfEnv)
if (is(current, "envRefClass"))
current <- current$copy(FALSE)
assign(field, current, envir = vEnv)
}
}
由于该字段是一个没有参数的活动绑定,分配将失败。一个简单的解决方案似乎是为所有活动绑定提供参数。在我的例子中,我使用了三个点。
test <- setRefClass("test", fields = list(x = function(...) y + 1 , y = "numeric"))
现在复制方法可以正常工作了。但是如果您尝试将值分配给活动绑定,该函数不会抛出错误(有时这是我在用例中需要的东西)。
所以我尝试的另一个解决方案是重新定义复制方法,只对那些不是活动绑定的字段执行 for 循环:
test <- setRefClass("test", fields = list( x = function() y + 1, y = "numeric"))
test$methods(copy = function (shallow = FALSE)
{
def <- .refClassDef
value <- new(def)
vEnv <- as.environment(value)
selfEnv <- as.environment(.self)
fields <- names(def@fieldClasses)[def@fieldClasses!= "activeBindingFunction"]
for (field in fields) {
if (shallow)
assign(field, get(field, envir = selfEnv), envir = vEnv)
else {
current <- get(field, envir = selfEnv)
if (is(current, "envRefClass"))
current <- current$copy(FALSE)
assign(field, current, envir = vEnv)
}
}
value
}
)
在我测试过的情况下似乎工作正常。不过我还没有彻底测试过,所以我不知道在其他情况下它是否会崩溃。