【发布时间】:2016-04-10 20:22:54
【问题描述】:
当我将某些内容直接打印到控制台时(键入一些变量名,例如x,而不是使用打印函数print(x)),我希望它的打印方式与通常的打印方式不同。我的想法是打印是由某些功能完成的。如果是这样的话,我所要做的就是用我自己的函数替换那个函数。但是,我无法弄清楚打印的内部功能是什么。
这是我迄今为止尝试过的。
.real_cat = cat
cat = function(x) .real_cat("*** cat ***", x, "\n")
cat(2345)
2345 # no
打印到控制台不是通过cat 完成的。 print呢?
.real_print = print
print = function(x) .real_cat("*** print ***", x, "\n")
print(2345)
2345 # no
"hello" # no
I(2345) # yes
一些类,如AsIs,通过print打印到控制台,但其他类,如numeric或character则不是。 :-(
c("print.numeric", "print.character", "print.AsIs", "print.default") %in% methods("print")
# FALSE FALSE TRUE TRUE
原来print 甚至没有单独的打印numeric 或character 的方法。具有print 方法的类使用print 打印到控制台。但是没有print 方法的类不是。也许它们是使用default 方法打印的?
print.default = function(x) .real_cat("*** print.default ***", x, "\n")
print.default(2345)
2345 # no
"hello" # no
没有。
也许如果我为数字定义一个方法,那么它会使用该方法打印它吗?
print.numeric = function(x) .real_cat("*** print.numeric ***", x, "\n")
print.numeric(2345)
2345 # no
print.character = function(x) .real_cat("*** print.character ***", x, "\n")
print.character("hello")
"hello" # no
这就是我卡住的地方。我想不出任何方法可以使用我自己的打印功能直接将numeric 或character 等基本类打印到控制台。
如果这有帮助,这就是我想要这样做的原因。我正在编写一个包来打印漂亮的值(https://github.com/prettyprint/prettyprint)。太多时候,分析的输出太难阅读,因此也难以理解。是的,您可以使用format、signif 和round 让它变得漂亮,这基本上就是该软件包在后台已经为您所做的。
我想让用户的打印效果尽可能简单。此时,他们必须调用我的漂亮打印函数 (pp(x))。我想尝试让用户选择自动打印漂亮的结果。 (我会同时打印非漂亮和漂亮版本的值,以确保在美化过程中不会丢失任何内容。)
【问题讨论】:
-
隐式类的解决方法是向对象添加类属性并使用
print方法。例如。print.numeric = function(x, ...) cat("numeric: \n", unclass(x), "\n"); xx = c(1, 2, 3); xx; attr(xx, "class") = "numeric"; xx。或者您可以定义自己的“类”及其print方法。
标签: r pretty-print