问题描述
我经常为自己的控制台漂亮地写这个习惯而感到厌烦:
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 >.<
vs paste0(list(1,2),collapse=‘,’)
:
[1] “1,2,3” # ahhh much better
•但是,由于wp
,paste0
函数不能很好地打印矩阵类型的obj:
m = matrix(list(1,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,list(3,list(5,6),list(7,8)),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,byrow=T)
print(m)
[,1] [,2]
[1,] List,2 List,2
[2,2 # ah.. much better...
•因此,我的问题是,如何在不随便插入淫秽的动态类型检查的情况下,制作出更好的wp
漂亮打印机:
wp = function(obj) {
if (typeof(obj) == ‘matrix’)
writeLines(print(obj))
else if (typeof(obj) == ‘list’)
writeLines(paste0(obj,’))
else
# etc ...
}
在base-R中必须有更好的方法来执行此操作。我更喜欢拥有自己的紧凑型utils,而不是包含一堆软件包,但是如果它确实可以归结为进行动态类型检查,则可以随意提供软件包解决方案。
解决方法
您可以覆盖打印方法-甚至包括内置类型的打印方法。
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,"))
}
wp(list(1,2
wp(matrix(1:6,nrow = 2))
#> [,1] [,2] [,3]
#> [1,] 1 3 5
#> [2,] 2 4 6