2016-11-21 20 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 

那麼,爲什麼,我有供應軸標籤surpress所有這些數字,我得到使用do.call什麼時候?

+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))