如何将列名传递给处理data.frames的函数

Ale*_*Sin 5 r ggplot2

我正在绘制许多类似的图,所以我想我写了一个函数来简化任务.我想传递它data.frame和要绘制的列的名称.这是我尝试过的:

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)
}
Run Code Online (Sandbox Code Playgroud)

现在,如果var是一个字符串,它将无法工作.如果将命令的aes一部分更改为,它将无法工作ggplot,y=data[,var]并且它会抱怨无法对闭包进行子集化.

那么解决这个问题和类似问题的正确方法/最佳实践是什么?如何将列名轻松安全地传递给想要对data.frames进行处理的函数?

jor*_*ran 10

Bad Joran,在评论中回答!

您想要使用aes_string,它允许您将变量名称作为字符串传递.在您的特定情况下,由于您似乎只想修改y变量,您可能希望重新组织在哪些geoms中映射哪些美学.例如,可能是这样的:

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)
Run Code Online (Sandbox Code Playgroud)

或者反过来,取决于你的口味.

  • @KarateSnowMachine您不能在同一层中同时使用`aes`和`aes_string`.您总是可以将它在`aes_string`中映射为`x ='Time'`等. (2认同)