2014-08-28 87 views
1

我想复制包含列表字段的引用类(foo)的实例。列表字段包含另一个类的实例(bar)。使用$copy()方法复制foo实例时,不会复制列表实例并继续引用同一对象。下面的代码说明了这个问题。有没有解决的办法?我如何做一个真正的深层复制?创建引用类的深层副本:不适用于列表字段?

bar<-setRefClass("bar", fields = list(name = "character")) 
foo<-setRefClass("foo", fields = list(tcp_vector = "list")) 


x1<-foo() 
x1$tcp_vector <- list(bar(name = "test1")) 

x1$tcp_vector[[1]]$name # equals "test1" 

x2 <- x1$copy() 

x2$tcp_vector[[1]]$name # equals "test1" 

x2$tcp_vector[[1]]$name <- "test2" # set to "test2" 

x2$tcp_vector[[1]]$name # equals "test2" 

x1$tcp_vector[[1]]$name # also equals "test2"?? 
+0

没有关于ref类的线索,如果复制是自动正确实现的,但是你可以用'copy = new(“MicroPlate”)之类的东西来覆盖它 listOldVars = ls(envir = self @ .data,all.names = T) for(i in listOldVars){ copy @ .data [[i]] = self @ .data [[i]] } return(copy)' – phonixor 2014-08-28 14:41:34

回答

1

copy方法实际上只复制ReferenceClass对象。您的foo类只有一个字段,即list,而“正常”字段不会被复制。此作品:

bar<-setRefClass("bar", fields = list(name = "character")) 
    foo<-setRefClass("foo", fields = list(tcp_vector = "bar")) 
    x1<-foo() 
    x1$tcp_vector <- bar(name = "test1") 
    x1$tcp_vector$name # equals "test1" 
    x2 <- x1$copy() 

    x2$tcp_vector$name # equals "test1" 

    x2$tcp_vector$name <- "test2" # set to "test2" 

    x2$tcp_vector$name # equals "test2" 

    x1$tcp_vector$name # equals "test" 

查看帮助?setRefClass了解详情。如果您想保留在OP中定义的foo类,我想您必须在创建x1的副本之前手动复制任何bar对象。

相关问题