2016-01-06 4 views
7

変更通常は印刷されます。私の考えは、印刷はある機能によって行われるということです。その場合、私がしなければならないことは、その機能を自分自身の機能で置き換えることだけです。しかし、私は印刷を行う内部機能が何であるか把握できません。私は(むしろ印刷機能<code>print(x)</code>を使用するよりも、このよう<code>x</code>として、いくつかの変数名を入力します)、コンソールに直接何かを印刷するとき、私はそれが違っその方法から印刷したいのですがどのように出力がコンソールに出力され

これまで私が試したことはこれです。

.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メソッドを持つクラスがprintを使用してコンソールに出力されている。printnumericまたはcharacterを印刷するための別の方法を持っていませんが判明。しかし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のような基本的なクラスを自分のプリント機能を使って直接コンソールに出力する方法はありません。

これが役に立ちましたら、私がこれをしたい理由があります。私はpretty-print値(https://github.com/prettyprint/prettyprint)にパッケージを書いています。あまりにも多くの時間、分析の出力は読みにくく、したがって理解することができます。はい、format,signif、およびroundを使用するとかなり美しくすることができます。これは基本的にはパッケージがバックグラウンドで既に実行しているものです。

できるだけ簡単にきれいな印刷をしたいと思います。この時点で、彼らは私のきれいなプリント機能(pp(x))を呼ばなければなりません。私は結果をきれいに印刷するオプションをユーザに与えて遊びたいと思っています。 (私は確信して何もprettifyingに失われないようにするために、非かわいいと価値のかなりバージョンの両方を印刷します)

+0

暗黙クラスで回避策は、オブジェクトにクラス属性を追加し、 'print'方法を使用することであろう。例えば。 'print.numeric = function(x、...)cat("数値:\ n "、unclass(x)、" \ n "); xx = c(1、2、3); xx; attr(xx、 "class")= "数値"; xx'。あるいは、独自の "クラス"とその 'print'メソッドを定義することもできます。 –

答えて

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

関連する問題