2016-01-06 90 views
7

當我將某些東西直接打印到控制檯(鍵入某些變量名稱,如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)。太多次,分析的輸出太難以閱讀,因此理解。是的,你可以使用formatsignifround,這基本上是這個包已經在後臺爲你做的。

我想爲用戶儘可能簡單地打印漂亮的照片。此時,他們必須打電話給我的漂亮打印功能(pp(x))。我想玩弄讓用戶可以自動打印結果的選項。 (我會同時打印非漂亮,價值漂亮的版本,以確保沒有丟失的美化。)

+0

與隱式類A的解決方法是一個類屬性添加到對象,並使用一個'print'方法。例如。 'print.numeric = function(x,...)cat(「numeric:\ n」,unclass(x),「\ n」); xx = c(1,2,3); XX; attr(xx,「class」)=「numeric」; xx'。或者你可以定義你自己的「類」和它的「打印」方法。 –

回答

6

the source此評論:

* 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 

因此,自動打印只能涉及顯式類的方法分派(帶有類屬性,也稱爲對象)。我假設numericprintVector處理。請自己檢查一下。

I增加了一個類AsIs(創建對象),然後print.AsIs分派:

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

我在這裏看到https://github.com/wch/r-source/blob/trunk/src/main/printvector.c一個名爲'printVector'的C函數。我如何確定哪個R函數調用它? – prettyprint

+0

這一切都在C級別處理。除非您打印對象,否則自動打印不涉及R功能。 – Roland