在R中,如何制作一种直接调整该对象插槽内值的S4对象的方法?

StackOverflow https://stackoverflow.com/questions/3412942

  •  26-09-2019
  •  | 
  •  

是否有一种方法可以允许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#。在这里阅读更多:

  1. http://adv-r.had.co.nz/r5.html

  2. http://www.inside-r.org/r-doc/methods/referenceclasses

据我所知(如果我正确地找到您),您必须重新复制整个对象。您无法轻松地通过引用传递值,它总是“按值”传递。因此,一旦修改(副本)对象,就需要将其重新复制回对象。

约翰·张伯(John Chamber)在他的书中很明确 数据分析软件. 。这是避免惊喜或副作用的一种方法。

我认为使用环境有一些解决方法,但我无能为力。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top