print(list(1,2,3)) 又长又丑;如何使用 print 打印列表 [即,无需在 print 与 paste0 之间切换的漂亮打印]

print(list(1,2,3)) is long and ugly; how to print lists using print [ie, pretty-printing without having to switch between print vs paste0]

我经常厌倦为我的控制台漂亮打印编写这个成语:

writeLines(paste0(“a=“, someObj))

所以我这样做了:

wp = function(obj) {
    writeLines(paste0(obj))
}

我之所以在上面使用 paste0 是因为它很好地折叠了 list:

print(list(1,2)) :

[[1]]
[1] 1

[[2]]
[2] 2     # ah... my eyes >.<

对比paste0(list(1,2),collapse=‘,’)

[1]  “1,2,3”    # ahhh much better

• 但是,由于 paste0:

wp 函数无法很好地打印矩阵类型的对象

m = matrix(list(1,2,3,4),nrow=2,byrow=T) paste0(m)

[1] “1” “3” “2” “4”    # yikes, this is supposed to be a matrix... my eyes

如果

,这很快就会看起来非常丑陋

m=matrix(list(list(1,2),list(3,4),list(5,6),list(7,8)),nrow=2,byrow=T) paste0(m)

[1] “list(1, 2)” “list(5, 6)” “list(3, 4)” “list(7, 8)”   # yikes again

而现在,相反,print 在紧凑打印矩阵方面做得更好:

m=matrix(list(list(1,2),list(3,4),list(5,6),list(7,8)),nrow=2,byrow=T) print(m)

      [,1]    [,2]
[1,]  List,2  List,2
[2,]  List,2  List,2   # ah.. much better...

• 所以我的问题是,如何制作更好的 wp 漂亮的打印机而不在各处插入淫秽的动态类型检查:

wp = function(obj) {
   if (typeof(obj) == ‘matrix’)
      writeLines(print(obj))
   else if (typeof(obj) == ‘list’)
      writeLines(paste0(obj,collapse=‘,’))
   else 
      # etc ...
}

在 base-R 中一定有更好的方法来做到这一点。我更喜欢拥有自己的紧凑型实用程序,而不是包含一堆包,但如果确实归结为进行动态类型检查,请随时提供包解决方案。

您可以覆盖打印方法 - 甚至是 built-in 类型的打印方法。

print.list <- function(x, ...) {
  writeLines(paste0(x, collapse = ","))
}

print(list(1, 2))
#> 1,2

或者,您可以创建自己的函数。

wp <- function(x, ...) {
  UseMethod("wp")
}

wp.default <- print

wp.list <- function(x, ...) {
  writeLines(paste0(x, collapse = ","))
}

wp(list(1, 2))
#> 1,2

wp(matrix(1:6, nrow = 2))
#>      [,1] [,2] [,3]
#> [1,]    1    3    5
#> [2,]    2    4    6