题
是否有一种方法可以允许S4对象的方法直接调整该对象插槽内部的值,而无需将整个对象复制到内存中,而必须在方法末尾重新编写它?现在,我有一个对象,该对象在跟踪自己的状态的位置。我调用将其推进到下一个状态的方法,但是现在似乎我必须分配()每个值(或调用方法的对象的副本)回到父环境。结果,面向对象的代码似乎正在运行 很多 比简单地调整循环中各种状态变量的代码慢。
解决方案
我本人在R列表上问了这个问题,并找到了通过引用模拟通行证的工作措施,其风格是:
eval(
eval(
substitute(
expression(object@slot <<- value)
,env=parent.frame(1) )
)
)
远离我说的最干净的代码...
来自R-HELP列表的建议使用环境来处理这些情况。编辑:插入的调整代码。
setClass("MyClass", representation(.cache='environment',masterlist="list"))
setMethod("initialize", "MyClass",
function(.Object, .cache=new.env()) {
.Object@masterlist <- list()
callNextMethod(.Object, .cache=.cache)
})
sv <- function(object,name,value) {} #store value
setMethod("sv",signature=c("MyClass","character","vector"),
function(object, name, value) {
object@.cache$masterlist[[name]] <- value
})
rv <- function(object,name) {} #retrieve value
setMethod("rv",signature=c("MyClass","character"),
function(object, name) {
return(object@.cache$masterlist[[name]])
})
其他提示
R具有三个面向对象的(OO)系统: S3, S4 和 参考类 (后者有一段时间被称为[[r5]],但他们的正式名称是参考类)。
参考类别(或replclasses)在R 2.12中是新的。它们填补了对以前由R.OO,Proto和Mutatr等非核心包装填充的可变物体的长期需求。虽然核心功能是可靠的,但参考类仍在积极开发中,一些细节将会改变。参考课程的最新文档始终可以在“ ReferenceClasses”中找到。
参考类和S3和S4之间有两个主要区别:
- 示例对象使用消息通话oo
- RefClass对象是可变的:不适用于修改语义上的通常的R副本。
这些属性使此对象系统的行为更像是Java和C#。在这里阅读更多:
据我所知(如果我正确地找到您),您必须重新复制整个对象。您无法轻松地通过引用传递值,它总是“按值”传递。因此,一旦修改(副本)对象,就需要将其重新复制回对象。
约翰·张伯(John Chamber)在他的书中很明确 数据分析软件. 。这是避免惊喜或副作用的一种方法。
我认为使用环境有一些解决方法,但我无能为力。
不隶属于 StackOverflow