2016-11-21 5 views
0

私はdo.callをだましています。"plot"に基づくdo.callセマンティクスの理解

I = iris 
do.call(what = "plot", args = c(I$Sepal.Length ~ I$Sepal.Width)) 
# This seems fine 

p = list(x = I$Sepal.Length, y = I$Sepal.Width) 
do.call(what = "plot", args = p) 
# This looks weird 

p1 = list(x = I$Sepal.Length, y = I$Sepal.Width, xlab = "") 
do.call(what = "plot", args = p1) 
# A bit less weird 


p2 = list(x = I$Sepal.Length, y = I$Sepal.Width, xlab = "", ylab = "") 
do.call(what = "plot", args = p2) 
# And this gives the same as the first do.call 

、なぜそれは私がdo.callを使用しているとき私が得るすべてのこれらの数字をsurpressする軸ラベルを供給しなければならないこと、ありますか?

+0

@ZheyuanLi '='を!。前者は 'plot.formula'を呼び出し、後者の' plot.default'を呼び出します。それが軸ラベルが異なる理由です。 – Roland

+0

いいえ、軸ラベルを参照します。私は彼らがxとyを切り替えるという問題に気づいたとは思わない。 – Roland

+0

私は答えを書くつもりです。 – Roland

答えて

1

あなたが見ているのは、引数から他の命名情報を得ることができない場合に、Rが軸ラベル上に置くものです。

plot(x=c(1,2,3,4,5,6,7,8),y=c(1,2,3,4,3,2,3,4)) 

この場合、プロットはベクトル値を軸ラベルとして使用する必要があります。

do.callを使用する場合、リスト引数の名前は、呼び出された関数の引数の名前と一致します。したがって、軸ラベルには名前が残っておらず、値だけが残っています。その時点で、データがI$Sepal.widthから来たという事実は長くなくなってしまいました。その値の単なるベクトルです。

+0

これは私が探していた答えでした。ありがとうございました。 –

3

最初に、plotが最初のパラメータに応じてメソッドを呼び出すS3 genericであることを理解する必要があります。 plot(y ~ x)の場合、この方法はplot.formulaであり、軸ラベルは数式から推論されます。 plot(x, y)(xとyの異なる順序に注意してください)を行う場合、メソッドはplot.defaultであり、パラメータとして渡されたシンボルから軸ラベルが推測されます。

a <- 1:2; y <- 3:4; plot(x = a, y = b)を入力すると、ラベルはabとなります。しかし、do.callのマジックを使用した場合、do.call(plot, list(x = a, y = b)plot(x = 1:2, y = 3:4)に拡張され、したがってラベルは1:23:4です。私はあなたの例のために、すなわち、dataパラメータで式の方法を使用することをお勧めしたい:あるべき

do.call(what = "plot", args = list(formula = Sepal.Length ~ Sepal.Width, 
            data = I)) 
関連する問題