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

时间:2016-01-06 16:46:44

标签: r pretty-print

当我直接向控制台打印某些内容(键入一些变量名称,例如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使用我自己的打印功能直接打印到控制台。

如果这有帮助,这就是我想要这样做的原因。我正在编写一个包含漂亮打印值的包(this SO question)。太多次,分析的输出太难以阅读,因此理解。是的,您可以使用formatsignifround使其变得漂亮,而这基本上就是该软件包已在后台为您做的事情。

我想为用户提供尽可能简单的漂亮打印。此时,他们必须调用我的漂亮打印功能(pp(x))。我想让用户选择让结果自动打印。 (我会打印非漂亮和漂亮版本的值,以确保在美化中没有任何东西丢失。)

1 个答案:

答案 0 :(得分:7)

the source中查看此评论:

i

因此,自动打印只能涉及显式类的方法调度(具有类属性,即.k.a。对象)。我假设while (true) { // ... } * 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 处理。请自己检查一下。

numeric添加了一个类printVector(创建一个对象),然后调度I

AsIs