首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:从S4方法中更改S4对象

R:从S4方法中更改S4对象
EN

Stack Overflow用户
提问于 2020-02-14 00:39:42
回答 1查看 548关注 0票数 1

我有一个S4对象,它表示一个递归树结构,包含同一类的一些数据和其他对象。我还有一个递归函数来修改树中每个节点的两个插槽。当我这样做时,这个函数(称为“繁殖()”)正确地执行它的任务:

代码语言:javascript
复制
> obj <- treeObj(4, 5)
> slotNames(obj)
[1] "x" "y" "listOfOtherTreeObjs"
> obj <- propagate(obj, 1, 4)  

我可以写一个这样的函数,它接受一个参数,并将数据填充到树中,没有问题。

不过,我想要的是能够从根对象的一个方法中调用propagate():

代码语言:javascript
复制
setMethod("transform", signature="treeObj",
    definition=function(object, i, j) {
         object@x <- i;  object@y <- j;
         object <- propagate(object, i, j);
         ... (do some other stuff in the tree)
    })

在这个方法中,繁殖()看起来像它应该的那样起作用,但是它的结果似乎没有以一种在transform()方法定义中可以检测到的方式分配给父对象。我的问题:

  1. ,我想这与R的逐值性质有关,我不能影响用于调用转换函数的对象的值。这是正确的,还是我只是愚蠢,这应该是可行的吗?

  1. ,有什么R魔法可以绕过这个问题吗?以某种方式调用'assign()‘函数来强制对象的新定义替换当前的对象?或者别的什么?
  2. 是否有更多的kind方法来构建递归对象来支持这类事情?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-14 08:58:27

要做到这一点,您需要做两件事:

1)推测,递归不会永远持续下去,也就是说,在某个时候,一个对象不会包含到另一个对象的链接,因为它位于树的底部。因此,您需要其他树objs列表为空的可能性。你用一个阶级联盟做这件事:

代码语言:javascript
复制
setClassUnion("listOfOtherTreeObjsOrNULL",c("listOfOtherTreeObjs","NULL"))

然后,要在对象的第三个槽中使用的正确类是这个新的类联合。

2)在为transform定义方法时,需要如下所示:

代码语言:javascript
复制
function(object,i,j){
  ## do whatever you want with i and j
  if(is.null(object@listOfOtherTreeObjs)) return(object)
  else{
    object@listOfOTherTreeObjs <- lapply(object@listOfOtherTreeObjs,propagate)
    return(object)
  }
}

您的更改似乎没有产生任何效果,原因是您没有从函数中提取任何内容,因此您只是修改对象的副本,而这些对象没有保存在任何地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60218493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档