当我直接将某些内容打印到控制台(键入一些变量名称,例如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
,但其他类,如numeric
或character
不是.:-(
c("print.numeric", "print.character", "print.AsIs", "print.default") %in% methods("print") # FALSE FALSE TRUE TRUE
结果print
甚至没有单独的打印方法numeric
或character
.使用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
这是我被卡住的地方.我想不出任何办法有一些基本的类象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
因此,自动打印只能涉及显式类的方法调度(具有类属性,即对象).我假设a numeric
是由...处理的printVector
.请自己检查一下.
I
添加一个类AsIs
(创建一个对象),然后print.AsIs
调度:
class(I(3)) #[1] "AsIs"