gpt4 book ai didi

r - 如何让 print() 将参数传递给 R 中用户定义的打印方法?

转载 作者:行者123 更新时间:2023-12-02 03:23:19 26 4
gpt4 key购买 nike

我在 R 中定义了一个 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(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()?怎么办?

最佳答案

按照 Josh 的建议,我找到了一种方法来避免 print.default() 在打印列表时被调用。我只是为列表编写了一个打印方法,因为似乎没有一个作为基础 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 有点不自在。它可能无法像内置的列表打印机制那样工作。

关于r - 如何让 print() 将参数传递给 R 中用户定义的打印方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31856189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com