当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《更改输出打印到控制台的方式》经验,为你挑选了1个好方法。

当我直接将某些内容打印到控制台(键入一些变量名称,例如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).太多次,分析的输出太难以阅读,因此理解.是的,你可以把它用漂亮format,signifround,而这基本上是封装已在后台为你做.

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



1> Roland..:

在源代码中查看此评论:

 *  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

因此,自动打印只能涉及显式类的方法调度(具有类属性,即对象).我假设a numeric是由...处理的printVector.请自己检查一下.

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

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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有