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
我经常厌倦为我的控制台漂亮打印编写这个成语:
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