2014-05-09 29 views
1

我需要顯示1-3個圖表,並且我希望圖表的標題基於使用的變量名稱。使用變量名稱作爲劇情標題與lapply

我能得到這個工作,我多麼希望下面:

library(grid) 
library(ggplot2) 
library(gridExtra) 

a1 <- sample(1:100) 
a2 <- sample(1:100) 
a3 <- sample(1:100) 

make_graph <- function(x, y=deparse(substitute(x))){ 
     time <- 1:100 
     dfp <- data.frame(time, x) 
     ggplot(dfp, aes(x=time, y=x)) + geom_point() + 
     ggtitle(y) 
} 

g1 <- make_graph(a1) 
g2 <- make_graph(a2) 
g3 <- make_graph(a3) 
grid.arrange(g1,g2,g3) 

但是,當我需要包括條件語句,如果只有1或2個樣品(即只A1或A1 & A2這成爲低效)。

我得到的一切以下工作,用正確的標題除外:

library(grid) 
library(ggplot2) 
library(gridExtra) 

a1 <- sample(1:100) 
a2 <- sample(1:100) 
a3 <- sample(1:100) 

sample_list <- paste0("a", seq_len(3)) 

make_graph <- function(x, y=deparse(substitute(x))){ 
     time <- 1:100 
     dfp <- data.frame(time, x) 
     ggplot(dfp, aes(x=time, y=x)) + geom_point() + 
     ggtitle(y) 
} 

graphs_list <- lapply(mget(sample_list), make_graph) 
do.call("grid.arrange", graphs_list) 

與上面的代碼我得到正確的功能,但deparse()在make_graph()似乎有一些問題,我假設由於被lapply打電話。因此,取而代之的是我在第一個例子中使用的標題(「a1」,「a2」,「a3」),而是將「X [[1L]]」,「X [[2L]]」,「X [ 3L]」。

我也試着改變lapply功能,但這只是給了我在列表中的第一個「頭銜」:

sample_list <- paste0("a", seq_len(3)) 

make_graph <- function(x, y){ 
     time <- 1:100 
     dfp <- data.frame(time, x) 
     ggplot(dfp, aes(x=time, y=x)) + geom_point() + 
     ggtitle(y) 
} 

graphs_list <- lapply(mget(sample_list), make_graph, y=sample_list) 
do.call("grid.arrange", graphs_list) 

我不知道最好的方法來完成我什麼試圖在這裏做。 感謝您的幫助。

回答

2

你對這些來自lapply的變量名稱是正確的。因此,在這種情況下,deparse戰略並不是一個好策略。但是,由於您使標題傳遞非常容易,因此您可以使用Map而不是lapply

graphs_list <- Map(make_graph, mget(sample_list), sample_list) 
do.call("grid.arrange", graphs_list) 

這給出了期望的結果。

sample plot

+0

太棒了!我發誓我每天都會學習一項新功能,我簡直不敢相信:) – user3564760

+2

@ user3564760而'Map'基本上是'mapply',默認不會簡化結果。所以它與'lapply'緊密相關,它只是讓你迭代多個參數傳遞給函數 – MrFlick