如何在 R 中设置包含自身的 Class(对于树)?

How can I set up a Class containing itself in R (for a tree)?

我需要一个可能包含也可能不包含自身的 class,以便在 R 中用作树。 每个Node都有Side,Analytical_Matrix,MaxChi2和P and Sons也是Node类型。

第一次创建Node时,需要Sons为空或NULL。但后来我创建了它们并将它们指定为儿子(我有最多 3 个儿子的限制)。

我试过这个来设置 Class:

setClass(Class = "Node",slots=c(Side="character",Analytical_matrix="data.frame",MaxChi2="data.frame",P="numeric",TerminalNode="logical",LSon="Node",CSon="Node",RSon="Node"),prototype = prototype(LSon=NULL,CSon=NULL,RSon=NULL))

这是为了声明新 class 的一个实例。我得到一个错误。我需要儿子们先是空的,因为这是一个无限循环,总是在寻找儿子的儿子的儿子。

Res=new(Class = "Node",Side=c("A","B"),Analytical_Matrix=data.frame(A=c(1,2)),MaxChi2=data.frame(A=c(3)),P=0.3),NodoTerminal=FALSE)

可以通过 "class union" 将 class 自身作为其插槽之一。这是一个 class 的简单示例,其中包含一个 id 整数槽和一个 parent 槽,我们希望它们相同 class:

setClass("myObject",representation(
    parent="myObject_or_NULL",
    id="integer"
),prototype=prototype(
    parent=NULL
)) -> myObject

setClassUnion("myObject_or_NULL",c("myObject","NULL"))

以上将生成一个警告,指出 "myObject_or_NULL" 未定义,但这只是一个警告,而不是错误。

现在,如果我们尝试制作一个新的:

myObject()

An object of class "myObject"
Slot "parent":
NULL

Slot "id":
integer(0)

我们不再有递归循环,因为默认是 NULL。实例化后,你当然可以将插槽设置​​为任何你喜欢的。