当我直接向控制台打印某些内容(键入一些变量名称,例如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
使用我自己的打印功能直接打印到控制台。
如果这有帮助,这就是我想要这样做的原因。我正在编写一个包含漂亮打印值的包(this SO question)。太多次,分析的输出太难以阅读,因此理解。是的,您可以使用format
,signif
和round
使其变得漂亮,而这基本上就是该软件包已在后台为您做的事情。
我想为用户提供尽可能简单的漂亮打印。此时,他们必须调用我的漂亮打印功能(pp(x)
)。我想让用户选择让结果自动打印。 (我会打印非漂亮和漂亮版本的值,以确保在美化中没有任何东西丢失。)
答案 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