2016-07-03 7 views
10

間のプラス記号:私はこの例を取得しようとしているggplot2およびその他の機能(R)

ggplot(MPG、AES(displ、HWY))+ geom_point()

ことができます誰かが私にこれらの2つの機能の間で何が起きているのかを説明してくれますか?

ggplot2は「プラス」演算子をオーバーロードしますか?これら2つをまとめた結果は何ですか?それは何に割り当てられていますか?それはR固有の機能ですか、あるいはggplot2特有ですか?それはパイプのようなものですか?

+9

見つけにくいですが、 'help(" + .gg ")'には必要な情報があります。 ggplot2がロードされた 'methods(" + ")'を使って '+ .gg'が存在することが分かりました。 –

+6

はい、いいえ。事実上パイプ(ハドレーはggplot2の後にmagrittrを発見してcoauthoredし、ggplotを変更するには遅すぎると言っています)が実際にパイプになっていますが、実際にはggplotオブジェクトに追加されています。ですから、関数間で 'data'パラメータを渡すと考えることができますが、それを加算関数と考えることはより有益です。 'ggplot_build'にプロットをラップして、オブジェクトが何であるかを知る。 – alistaire

+0

説明のために皆さん、ありがとう! – mimic

答えて

3

コメントに@Richard Scrivenが参照する関数定義は、plot-construction.rで定義されているため、より明確になる場合があります。あなたは、2つの(非通知の)関数が何をするか(呼び出しのLHSがthemeggplotのオブジェクトであるかどうか)を正確に見るためにソースを調べる必要がありますが、その名前はかなり良いアイデアを与えるはずです。戻り値はe1で、「追加」はe2に変更されています。

"+.gg" <- function(e1, e2) { 
    # Get the name of what was passed in as e2, and pass along so that it 
    # can be displayed in error messages 
    e2name <- deparse(substitute(e2)) 

    if  (is.theme(e1)) add_theme(e1, e2, e2name) 
    else if (is.ggplot(e1)) add_ggplot(e1, e2, e2name) 
} 

だから、はい、+は、クラスgg(すべてggplot2オブジェクト)を継承するオブジェクトのために過負荷になっています。

私は 'パイプ'(@ alistaireのコメント)は誤解を招く類推であると思います。これは、標準のOpsグループの一般的なスタイルに非常によく似ています。

関連する問題