2014-05-09 8 views
1

Je dois afficher entre 1-3 graphiques, et je veux que les titres des graphiques soient basés sur le nom de la variable utilisée.Utiliser le nom de variable comme titre de parcelle avec lapplication

Je peux obtenir que cela fonctionne comme je veux ci-dessous:

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) 

Mais cela devient inefficace quand je dois inclure des instructions conditionnelles s'il y a seulement 1 ou 2 échantillons (soit seulement a1, ou a1 & a2).

j'ai eu tout à travailler ci-dessous, à l'exception des titres corrects:

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) 

Avec le code ci-dessus je reçois la fonctionnalité correcte, mais Deparse() dans make_graph() semble avoir des problèmes, Je suppose en raison d'être appelé avec lapply. Donc, au lieu des titres que j'avais dans l'exemple initial ("a1", "a2", "a3"), j'ai plutôt "X [[1L]]", "X [[2L]]", "X [[ 3L]] ".

J'ai aussi essayé de modifier la fonction lapply, mais cela ne me donne le premier « titre » dans la liste:

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) 

Je ne suis pas sûr de la meilleure approche pour accomplir ce que je suis essayant de faire ici. Merci pour toute aide.

Répondre

2

Vous avez raison concernant les noms de variables provenant de lapply. Alors que la stratégie deparse n'est pas une bonne dans ce cas. Mais puisque vous l'avez rendu très facile à transmettre le titre, vous pouvez simplement utiliser Map plutôt que lapply.

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

Ceci donne le résultat souhaité.

sample plot

+0

Brilliant! Je jure que j'apprends une nouvelle fonction tous les jours, je ne peux pas croire que c'était si facile :) – user3564760

+2

@ user3564760 Et 'Map' est fondamentalement' mapply' qui par défaut ne simplifie pas le résultat. Donc, il est étroitement lié à 'lapply' il vous permet juste d'itérer sur plusieurs paramètres pour passer à la fonction – MrFlick

Questions connexes