我在R中定义了一个需要自己的print方法的S3类。当我创建这些对象的列表并打印它时,R会对列表中的每个元素使用我的print方法。
我希望能够控制打印方法实际显示的程度。因此,我的类的print方法需要一些额外的参数。但是,在打印对象列表时,我还没有找到使用这些参数的方法。
为了更清楚,我举一个例子。以下代码定义了类test
的两个对象,一个包含对象和类的打印方法的列表:
obj1 <- list(a = 3, b = 2)
class(obj1) <- "test"
obj2 <- list(a = 1, b = 5)
class(obj2) <- "test"
obj_list <- list(obj1, obj2)
print.test <- function(x, show_b = FALSE, ...) {
cat("a is", x$a, "\n")
if (show_b) cat("b is", x$b, "\n")
}
打印单个对象按预期工作:
print(obj1)
## a is 3
print(obj2, show_b = TRUE)
## a is 1
## b is 5
当我打印obj_list
时,我的print方法用于打印列表中的每个对象:
print(obj_list)
## [[1]]
## a is 3
##
## [[2]]
## a is 1
但我希望能够告诉print()
在这种情况下也显示b
。以下(有点天真...)代码不会产生所需的结果:
print(obj_list, show_b = TRUE)
## [[1]]
## a is 3
##
## [[2]]
## a is 1
是否可以打印obj_list
并同时将参数show_b = TRUE
传递给print.test()
?怎么样?
答案 0 :(得分:1)
根据Josh的建议,我找到了一种方法来避免在打印列表时调用print.default()
。我只是为列表编写了一个print方法,因为似乎没有一个作为基础R的一部分存在:
print.list <- function(x, ...) {
list_names <- names(x)
if (is.null(list_names)) list_names <- rep("", length(x))
print_listelement <- function(i) {
if (list_names[i]=="") {
cat("[[",i,"]]\n", sep="")
} else {
cat("$", list_names[i], "\n", sep="")
}
print(x[[i]], ...)
cat("\n")
}
invisible(lapply(seq_along(x), print_listelement))
}
相关部分是,当列表中的对象被打印时,...
被传递给print
。现在,回到问题中的示例,打印test
对象列表与show_b =TRUE
一起使用:
print(obj_list, show_b = TRUE)
## [[1]]
## a is 3
## b is 2
##
## [[2]]
## a is 1
## b is 5
但是,我自己定义print.list
有点不可思议。有可能它不像列表的内置打印机制那样工作。