【问题标题】:Changing how output is printed to the console更改输出打印到控制台的方式
【发布时间】: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打印到控制台,但其他类,如numericcharacter则不是。 :-(

c("print.numeric", "print.character", "print.AsIs", "print.default") %in% methods("print")
# FALSE FALSE  TRUE  TRUE

原来print 甚至没有单独的打印numericcharacter 的方法。具有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

这就是我卡住的地方。我想不出任何方法可以使用我自己的打印功能直接将numericcharacter 等基本类打印到控制台。

如果这有帮助,这就是我想要这样做的原因。我正在编写一个包来打印漂亮的值(https://github.com/prettyprint/prettyprint)。太多时候,分析的输出太难阅读,因此也难以理解。是的,您可以使用formatsignifround 让它变得漂亮,这基本上就是该软件包在后台已经为您所做的。

我想让用户的打印效果尽可能简单。此时,他们必须调用我的漂亮打印函数 (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


【解决方案1】:

the source看到这条评论:

 *  print.default()  ->  do_printdefault (with call tree below)
 *
 *  auto-printing   ->  PrintValueEnv
 *                      -> PrintValueRec
 *                      -> call print() for objects
 *  Note that auto-printing does not call print.default.
 *  PrintValue, R_PV are similar to auto-printing.
 *
 *  do_printdefault
 *  -> PrintDefaults
 *  -> CustomPrintValue
 *      -> PrintValueRec
 *          -> __ITSELF__  (recursion)
 *          -> PrintGenericVector   -> PrintValueRec  (recursion)
 *          -> printList            -> PrintValueRec  (recursion)
 *          -> printAttributes      -> PrintValueRec  (recursion)
 *          -> PrintExpression
 *          -> printVector      >>>>> ./printvector.c
 *          -> printNamedVector >>>>> ./printvector.c
 *          -> printMatrix      >>>>> ./printarray.c
 *          -> printArray       >>>>> ./printarray.c

因此,自动打印只能涉及显式类(具有类属性,也称为对象)的方法分派。我假设numericprintVector 处理。请自行检查。

I 添加一个类AsIs(创建一个对象),然后调度print.AsIs

class(I(3))
#[1] "AsIs"

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多