簡體   English   中英

使用lapply的情節列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM