我在使用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
值?
謝謝!
我在使用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
值?
謝謝!
這是因爲plot.default
嘗試爲x
建立合理的標籤和y
如果xlab
和ylab
是NULL
使用
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>
設置xlab
和ylab
顯然是要走的路。
do.call(plot, list(x=z,y=y, xlab = "x",ylab="y"))
要使用do.call
你需要通過z
和y
姓名所以他們沒有得到評估的時間提前。
do.call("plot", list(x=as.name("z"), y=as.name("y")))
但代碼肯定的感覺一樣,如果你設置xlab
和ylab
明確爲@mnel建議它會更清晰。
因爲'plot'使用'deparse(substitute(。))'嘗試從傳遞的'x'和'y'變量中檢索標籤;在這種情況下,他們已經被評估,所以你會得到垃圾。你可以明確地設置標籤或嘗試拿出適當的'eval'咒語...... –
謝謝,本!你可以用我的例子給出一個eval()的例子嗎? –
我無法很快弄清楚,這就是爲什麼我只留下評論而不回答...... @ mnel的回答看起來不錯。 –