2016-01-22 54 views
1

如果您有活動綁定,似乎複製方法不起作用。R參考類別:具有活動綁定的複製方法

Example類:

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 
+0

活動綁定需要有形式'function(value){}'以允許賦值; 'copy()'試圖將字段設置爲舊的'值'。 –

+0

非常感謝@MartinMorgan!這種行爲似乎仍然有點奇怪,因爲沒有參數的活動綁定很常見!根據您的回答,我創建了一種不嘗試將值分配給活動綁定的複製方法,如有必要,請隨時糾正我的答案! –

回答

0

根據馬丁的評論,問題就出在默認copy方法的assign()部分:

for (field in names([email protected])) { 
     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([email protected])[[email protected]dClasses!= "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 
} 
) 

好像在我測試的情況下工作正常。儘管我還沒有完全測試過,所以我不知道它是否會在其他情況下崩潰。