我有一个S4对象,它表示一个递归树结构,包含同一类的一些数据和其他对象。我还有一个递归函数来修改树中每个节点的两个插槽。当我这样做时,这个函数(称为“繁殖()”)正确地执行它的任务:
> obj <- treeObj(4, 5)
> slotNames(obj)
[1] "x" "y" "listOfOtherTreeObjs"
> obj <- propagate(obj, 1, 4) 我可以写一个这样的函数,它接受一个参数,并将数据填充到树中,没有问题。
不过,我想要的是能够从根对象的一个方法中调用propagate():
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()方法定义中可以检测到的方式分配给父对象。我的问题:
,
,
提前谢谢。
发布于 2020-02-14 08:58:27
要做到这一点,您需要做两件事:
1)推测,递归不会永远持续下去,也就是说,在某个时候,一个对象不会包含到另一个对象的链接,因为它位于树的底部。因此,您需要其他树objs列表为空的可能性。你用一个阶级联盟做这件事:
setClassUnion("listOfOtherTreeObjsOrNULL",c("listOfOtherTreeObjs","NULL"))然后,要在对象的第三个槽中使用的正确类是这个新的类联合。
2)在为transform定义方法时,需要如下所示:
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)
}
}您的更改似乎没有产生任何效果,原因是您没有从函数中提取任何内容,因此您只是修改对象的副本,而这些对象没有保存在任何地方。
https://stackoverflow.com/questions/60218493
复制相似问题