2012-03-02 4 views
5

Я рисую много похожих графиков, поэтому я решил написать функцию, упрощающую задачу. Я хотел бы передать ему data.frame и имя столбца, который будет отображаться. Вот то, что я пробовал:Как передать имена столбцов функции, обрабатывающей 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) 
} 

Теперь, если var это строка не будет работать. Он не будет работать, если изменить команду aes команды ggplot на y=data[,var], и она будет жаловаться на невозможность подмножества закрытия.

Итак, что является правильным способом/лучшей практикой для решения этой и подобных проблем? Как я могу легко и безопасно передавать имена столбцов в функции, которые хотели бы обрабатывать на data.frames?

+2

Вместо этого используйте 'aes_string'. – joran

+1

@joran вы могли бы также опубликовать это как ответ. – Justin

ответ

10

Bad Joran, отвечая на комментарии!

Вы хотите использовать aes_string, что позволяет передавать имена переменных в виде строк. В вашем конкретном случае, поскольку вам кажется, что вы хотите изменить переменную y, вы, вероятно, захотите реорганизовать, какие эстетики отображаются в геометрии. Например, может быть примерно следующее:

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) 

или, возможно, наоборот, в зависимости от ваших вкусов.

+0

joran, есть ли способ смешать aes() и aes_string() в том же вызове ggplot? то есть, если моя ось x всегда является общей для всех геометров, включение ее в вызовы geom кажется довольно неуклюжим. – KarateSnowMachine

+2

@KarateSnowMachine. Вы не можете использовать оба 'aes' и' aes_string' в том же слое. Вы всегда можете просто сопоставить его в 'aes_string' как' x = 'Time'' и т. Д. – joran

+0

спасибо, я не понимал, что все так просто. – KarateSnowMachine

Смежные вопросы