r 中 s3 class 的 class 化树问题的递归
Recursion for a classification tree problem in r for an s3 class
我正在写一个 class (s3),它应该使用构造函数为 class 创建一个实例,至少一开始是这样。构造函数junction(name, left, right)
。其中 name
是 classification 树中节点的描述。
所以我有一个名为 junction
的 class,它有 3 个条目,如上所述。
junction <- function(name = character()) {
left = NULL
right = NULL
value <- list(name = name, left = left, right = right)
attr(value, "class") <- "junction"
value
}
left
和right
对应树的下一个左右节点,但在叶子节点处变成NULL
。我需要正确定义上面的构造函数,以便我可以创建叶节点。然后我尝试编写一个简单的打印方法,它递归地工作以生成以下示例;
junction("Tom", junction("Wendy", junction("Jane"), junction("Nancy")), junction("Ellen"))
Tom
+- Wendy
| +- Jane
| +- Nancy
+- Elen
关于如何编写 print.junction(obj, some_str, ...)
我在这里添加 some_str
有什么想法认为它可能有助于递归 - 在当前输出之前提供字符串节点。 java 甚至 c++ 都有这种递归的想法,但我找不到任何与 R 相关的东西。
如果您将构造函数更改为
junction <- function(name = character(), left=NULL, right=NULL) {
value <- list(name = name, left = left, right = right)
attr(value, "class") <- "junction"
value
}
然后你可以定义一个递归打印语句
print.junction <- function(x, nested=FALSE) {
adorn <- function(v) if (length(v)>0) {
paste0(c("+-", rep("| ", length(v)-1)), v)} else {c()}
r <- x$name
child <- c()
if (!is.null(x$left)) {
rl <- print.junction(x$left, nested=TRUE)
child <- c(child, adorn(rl))
}
if (!is.null(x$right)) {
rr <- print.junction(x$right, nested=TRUE)
child <- c(child, adorn(rr))
}
if (!nested) {
cat(c(r, child), sep="\n")
}
invisible(c(r, child))
}
所以当你打电话时
junction("Tom", junction("Wendy", junction("Jane"), junction("Nancy")), junction("Ellen"))
你得到
Tom
+-Wendy
| +-Jane
| +-Nancy
+-Ellen
这个想法是一种简单的递归方法。您不断调用函数,为每一层嵌套添加特殊标记。
我正在写一个 class (s3),它应该使用构造函数为 class 创建一个实例,至少一开始是这样。构造函数junction(name, left, right)
。其中 name
是 classification 树中节点的描述。
所以我有一个名为 junction
的 class,它有 3 个条目,如上所述。
junction <- function(name = character()) {
left = NULL
right = NULL
value <- list(name = name, left = left, right = right)
attr(value, "class") <- "junction"
value
}
left
和right
对应树的下一个左右节点,但在叶子节点处变成NULL
。我需要正确定义上面的构造函数,以便我可以创建叶节点。然后我尝试编写一个简单的打印方法,它递归地工作以生成以下示例;
junction("Tom", junction("Wendy", junction("Jane"), junction("Nancy")), junction("Ellen"))
Tom
+- Wendy
| +- Jane
| +- Nancy
+- Elen
关于如何编写 print.junction(obj, some_str, ...)
我在这里添加 some_str
有什么想法认为它可能有助于递归 - 在当前输出之前提供字符串节点。 java 甚至 c++ 都有这种递归的想法,但我找不到任何与 R 相关的东西。
如果您将构造函数更改为
junction <- function(name = character(), left=NULL, right=NULL) {
value <- list(name = name, left = left, right = right)
attr(value, "class") <- "junction"
value
}
然后你可以定义一个递归打印语句
print.junction <- function(x, nested=FALSE) {
adorn <- function(v) if (length(v)>0) {
paste0(c("+-", rep("| ", length(v)-1)), v)} else {c()}
r <- x$name
child <- c()
if (!is.null(x$left)) {
rl <- print.junction(x$left, nested=TRUE)
child <- c(child, adorn(rl))
}
if (!is.null(x$right)) {
rr <- print.junction(x$right, nested=TRUE)
child <- c(child, adorn(rr))
}
if (!nested) {
cat(c(r, child), sep="\n")
}
invisible(c(r, child))
}
所以当你打电话时
junction("Tom", junction("Wendy", junction("Jane"), junction("Nancy")), junction("Ellen"))
你得到
Tom
+-Wendy
| +-Jane
| +-Nancy
+-Ellen
这个想法是一种简单的递归方法。您不断调用函数,为每一层嵌套添加特殊标记。