更改输出打印到控制台的方式

Changing how output is printed to the console

当我直接向控制台打印某些内容时(键入一些变量名,例如 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 使它变得漂亮,这基本上就是包在后台为您所做的。

我想为用户提供尽可能简单的漂亮打印。此时,他们必须调用我的 pretty-print 函数 (pp(x))。我想尝试让用户选择自动打印漂亮的结果。 (我会同时打印值的非漂亮版本和漂亮版本,以确保在美化过程中不会丢失任何内容。)

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

因此,auto-printing 只能涉及显式 classes 的方法分派(具有 class 属性,a.k.a. 对象)。我假设 numericprintVector 处理。请自行检查。

I 添加一个 class AsIs (创建一个对象)然后 print.AsIs 被调度:

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