我正在编写一个类(s3),它应该使用构造函数为该类创建一个实例,至少在开始时是这样。构造函数junction(name, left, right)。其中name是对分类树中节点的描述。
因此,我有一个名为junction的类,如上所述,它有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。我需要正确地定义上面的构造函数,这样我才能创建一个叶节点。然后,我尝试编写一个简单的print方法,该方法递归地生成以下示例;
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相关的东西。
发布于 2021-05-23 16:30:17
如果您将构造函数更改为类似于
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这个想法是一种简单的递归方法。您不断地调用函数,为每一层嵌套添加特殊的标记。
https://stackoverflow.com/questions/67657573
复制相似问题