当我直接将某些内容打印到控制台(键入一些变量名称,例如x,而不是使用打印功能print(x))时,我希望它的打印方式与正常打印方式不同.我的想法是打印是通过某些功能完成的.如果是这种情况,我所要做的就是用我自己的函数替换该函数.但是,我无法弄清楚打印的内部功能是什么.
这是我到目前为止所尝试的内容.
.real_cat = cat
cat = function(x) .real_cat("*** cat ***", x, "\n")
cat(2345)
2345 # no
Run Code Online (Sandbox Code Playgroud)
打印到控制台不是通过cat.怎么样print?
.real_print = print
print = function(x) .real_cat("*** print ***", x, "\n")
print(2345)
2345 # no
"hello" # no
I(2345) # yes
Run Code Online (Sandbox Code Playgroud)
有些类,比如AsIs,打印到控制台print,但其他类,如numeric或character不是.:-(
c("print.numeric", "print.character", "print.AsIs", "print.default") %in% methods("print")
# FALSE FALSE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
结果print甚至没有单独的打印方法numeric或character.使用print方法将具有方法的类打印到控制台print.但是没有print方法的类不是.也许他们是用这种default方法打印的?
print.default = function(x) .real_cat("*** print.default ***", x, "\n")
print.default(2345)
2345 # no
"hello" # no
Run Code Online (Sandbox Code Playgroud)
没有.
也许如果我为数字定义一个方法,那么它会使用该方法打印它?
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
Run Code Online (Sandbox Code Playgroud)
这是我被卡住的地方.我想不出任何办法有一些基本的类象numeric或character打印出来,直接用自己的打印功能,以控制台.
如果这有帮助,这就是我想要这样做的原因.我正在编写一个包含漂亮打印值的包(https://github.com/prettyprint/prettyprint).太多次,分析的输出太难以阅读,因此理解.是的,你可以把它用漂亮format,signif和round,而这基本上是封装已在后台为你做.
我想为用户提供尽可能简单的漂亮打印.此时,他们必须调用我的漂亮打印功能(pp(x)).我想让用户可以选择让结果自动打印.(我会打印非漂亮和漂亮版本的值,以确保在美化中没有任何东西丢失.)
在源代码中查看此评论:
* 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
Run Code Online (Sandbox Code Playgroud)
因此,自动打印只能涉及显式类的方法调度(具有类属性,即对象).我假设a numeric是由...处理的printVector.请自己检查一下.
I添加一个类AsIs(创建一个对象),然后print.AsIs调度:
class(I(3))
#[1] "AsIs"
Run Code Online (Sandbox Code Playgroud)