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

时间:2015-08-06 12:45:40

标签: r

我在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()?怎么样?

1 个答案:

答案 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有点不可思议。有可能它不像列表的内置打印机制那样工作。