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
}

leftright对应树的下一个左右节点,但在叶子节点处变成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

这个想法是一种简单的递归方法。您不断调用函数,为每一层嵌套添加特殊标记。