将不同的列传递给函数内的aes

时间:2014-07-10 17:38:57

标签: r function ggplot2

我正在尝试编写一个函数来调用带有不同参数的ggplot:

hmean <- function(data, column, Label=label){
  ggplot(data,aes(column)) +
    geom_histogram() +
    facet_wrap(~Antibody,ncol=2) +
    ggtitle(paste("Mean Antibody Counts (Log2) for ",Label," stain"))
}
hmean(Log2Means,Primary.Mean, Label="Primary")
Error in eval(expr, envir, enclos) : object 'column' not found

Primary.Mean是不同的论点(我有多种方法)。在这里发表了各种帖子后我试过了

  1. 传递引用和不引用的列名称(其中包含&#34;意外字符串常量&#34;或&#34;找不到对象错误)
  2. 设置本地环境(foo <-environment()后跟ggplot中的environment= arg)
  3. 使用data2$column <- data[,column]
  4. 创建数据集的新副本

    这些似乎都不适用于ggplot。如何编写有效的功能? 我将使用不同的data.frames和列调用它:

    hmean(Log2Means, Primary.mean, Label="Primary")
    hmean(Log2Means, Secondary.mean, Label="Secondary")
    hmean(SomeOtherFrame, SomeColumn, Label="Pretty Label")
    

3 个答案:

答案 0 :(得分:2)

您的示例不是reproducible,但可能会有效:

hmean <- function(data, column, Label=label){
    ggplot(data, do.call("aes", list(y = substitute(column))) ) +
        geom_histogram() +
        facet_wrap(~Antibody,ncol=2) +
        ggtitle(paste("Mean Antibody Counts (Log2) for ",Label," stain"))
}

hmean(Log2Means,Primary.Mean, Label="Primary")

如果您需要更多aes的参数,请执行以下操作:

do.call("aes", list(y = substitute(function_parameter), x = quote(literal_parameter)))

答案 1 :(得分:1)

你可以试试这个:

hmean <- function(data, column, Label=label){

  # cool trick?
  data$pColumn <- data[, column]

  ggplot(data,aes(pColumn)) +
  geom_histogram() +
  facet_wrap(~Antibody,ncol=2) +
  ggtitle(paste("Mean Antibody Counts (Log2) for ",Label," stain"))
}
hmean(Log2Means,'Primary.Mean', Label="Primary")

答案 2 :(得分:-1)

我最终使用aes_string()调用:aes_string(x=foo, y=y, colour=color),wehre ycolor也在ggplot()外部定义。