2012-03-02 16 views
5

Estoy trazando muchos gráficos similares, así que pensé en escribir una función para simplificar la tarea. Me gustaría pasarle un data.frame y el nombre de la columna que se trazará. Esto es lo que he intentado:Cómo pasar nombres de columna a una función que procesa data.frames

plot_individual_subjects <- function(var, data) 
{ 
    require(ggplot2) 

    ggplot(data, aes(x=Time, y=var, group=Subject, colour=SubjectID)) + 
    geom_line() + geom_point() + 
    geom_text(aes(label=Subject), hjust=0, vjust=0) 
} 

Ahora bien, si var es una cadena no va a funcionar. Tampoco funcionará si se cambia la parte aes del comando ggplot al y=data[,var] y se quejará de que no se puede subconjuntar un cierre.

Entonces, ¿cuál es la forma correcta/mejor práctica para resolver este y otros problemas similares? ¿Cómo puedo pasar los nombres de las columnas de manera fácil y segura a las funciones que deseen procesar en data.frames?

+2

Use 'aes_string' en su lugar. – joran

+1

@joran también podría publicar eso como una respuesta. – Justin

Respuesta

10

Bad Joran, respondiendo en los comentarios!

Quiere usar aes_string, que le permite pasar nombres de variables como cadenas. En su caso particular, dado que parece que solo desea modificar la variable y, probablemente desee reorganizar qué estética se asigna en qué geoms. Por ejemplo, tal vez algo como esto:

ggplot(data, aes_string(y = var)) + 
    geom_line(aes(x = Time,group = Subject,colour = SubjectID)) + 
    geom_point(aes(x = Time,group = Subject,colour = SubjectID)) + 
    geom_text(aes(x = Time,group = Subject,colour = SubjectID,label = Subject),hjust =0,vjust = 0) 

o tal vez al revés, según sus gustos.

+0

joran, ¿hay alguna manera de mezclar aes() y aes_string() en la misma llamada ggplot? es decir, si mi eje x es siempre común para todos los geoms, ponerlo en las llamadas geom parece un poco torpe – KarateSnowMachine

+2

@KarateSnowMachine No se pueden usar tanto 'aes' como' aes_string' en la misma capa. Siempre puedes asignarlo en 'aes_string' como' x = 'Time'', etc. – joran

+0

gracias, no me di cuenta de que fue así de fácil. – KarateSnowMachine

Cuestiones relacionadas