如何在 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
。实例化后,你当然可以将插槽设置为任何你喜欢的。
我需要一个可能包含也可能不包含自身的 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
。实例化后,你当然可以将插槽设置为任何你喜欢的。