[英]List of plots using lapply
我最近一直在使用lapply和sapply作為我的首選功能。 到目前為止這么好,但為什么下面的代碼不起作用讓我感到困惑。
df<-as.data.frame(matrix(rnorm(50),ncol=5))
names(df)<-c("x1","x2","x3","x4","x5")
df1<-seq_len(10)
ll<-lapply(seq(1,5), function(i) qplot(df1,df[,i]))
我收到錯誤:
Error in `[.data.frame`(df, , i) : undefined columns selected
好吧,顯然我在可重現的代碼中犯了一個很不幸的錯誤。 它現在有效,但ll
列表中的所有圖都是相同的圖。 當我運行這個:
do.call(grid.arrange,ll)
我得到以下圖像:
所有的情節都是一樣的! 這也是我通過數據運行時獲得的輸出。
懶惰評估存在問題,或者無論如何都有類似的問題。 您需要執行以下操作:
ll<-lapply(
seq(1,5),
function(i) qplot(data=data.frame(y=df[, i]), df1, y)
)
這將強制為每個繪圖更新y值。
在其他SO帖子中進行更多討論。
你得到的問題與懶惰的評估有關。 這意味着ll
中的函數只有在調用它們時才會被真正計算出來,這是在grid.arrange
。 那時,每個函數都會嘗試定位i
,到那時它的值為5
,因為這是lapply
循環結束時i
的最后一個值。 因此,從df
提取的數據始終是第五列,因此您的繪圖都是相等的。
為了防止這種情況,您需要在創建函數時強制進行數據提取,例如使用@ BrodieG的方法。 在那里,創建了一個新的data.frame
,強制從df
中獲取數據。 或者,您可以使用force
來強制評估i
。
另請參閱有關延遲評估的更多示例和說明:
為了在同一data.frame中創建多列的圖,我將使用facet_wrap
。 要使用facet_wrap
,您需要使用reshape2
包中的melt
重新排序數據:
library(ggplot2)
library(reshape2)
df$xvalues = 1:10
df_melt = melt(df, id.vars = 'xvalues')
ggplot(df_melt, aes(x = xvalues, y = value)) +
geom_point() + facet_wrap(~ variable)
你告訴它執行10列,你只有5個。這有效:
ll<-lapply(seq(1,5), function(i) qplot(df1,df[,i]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.