R Reference Class:带有活动绑定的复制方法

时间:2016-01-22 19:49:43

标签: r reference-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   

1 个答案:

答案 0 :(得分:0)

根据Martin的评论,问题出在默认assign()方法的copy部分:

 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
}
)

在我测试的情况下似乎工作正常。我没有彻底测试过,所以我不知道在其他情况下是否会破坏。