2013-11-26 30 views
2

我在使用do.call來構建函數。但我遇到了這樣一個問題:R:爲什麼do.call圖帶有y值

z<-sample(1:3, 100, T) 
y<-rnorm(100) 
plot.list <- c(list(x=z,y=y)) 
do.call(plot, plot.list) 

爲什麼劇情包括了y值?

謝謝!

+0

因爲'plot'使用'deparse(substitute(。))'嘗試從傳遞的'x'和'y'變量中檢索標籤;在這種情況下,他們已經被評估,所以你會得到垃圾。你可以明確地設置標籤或嘗試拿出適當的'eval'咒語...... –

+0

謝謝,本!你可以用我的例子給出一個eval()的例子嗎? –

+0

我無法很快弄清楚,這就是爲什麼我只留下評論而不回答...... @ mnel的回答看起來不錯。 –

回答

1

這是因爲plot.default嘗試爲x建立合理的標籤和y如果xlabylabNULL

使用

deparse(substitute(y)) 

然而,使用do.call,創建列表,並稱爲變量y被其內容替換,因此該方法使標籤具有整個變量

foo <- function(y) deparse(substitute(y)) 
> do.call(foo, list(y=y)) 
[1] "c(1.19006018249756, -0.50627079218304, -0.103312348822805, 0.395028889714542, " 
[2] "1.25258077222837, 2.63766225444435, 0.260296813253391, 0.280839960496168, "  
[3] "-1.47428483557887, -0.585934600873922, 0.879979238185618, -0.0871689899965067, " 
..... <truncated> 

設置xlabylab顯然是要走的路。

do.call(plot, list(x=z,y=y, xlab = "x",ylab="y")) 
1

要使用do.call你需要通過zy姓名所以他們沒有得到評估的時間提前。

do.call("plot", list(x=as.name("z"), y=as.name("y"))) 

但代碼肯定的感覺一樣,如果你設置xlabylab明確爲@mnel建議它會更清晰。

相關問題