从全局环境访问直接传递给ggplot包装器中的函数的对象

时间:2015-11-11 13:07:42

标签: r function ggplot2 environment scoping

我为ggplot2生成一个原始包装器来生成直方图。由于我生成了大量的图形,因此我更容易拥有一个能够遍历所有变量并吐出所需图形的函数。我的功能代码如下:

# Libs
require(ggplot2); require(ggthemes); require(grid)

GenerateHistogram <- function(histogramVariable, dataSet,
                              graphTitle = "Graph Title",
                              xAxis = "Count",
                              yAxis = "x axis title") {

  # Get the histogram value as indicator
  histVar <- get(paste(deparse(substitute(dataSet)), histogramVariable,
                       sep = "$"), envir = parent.frame(), 
                 inherits = TRUE)

  # Plot definition
  hist_plot <- ggplot(data = dataSet, aes_string(x = histogramVariable)) +
    geom_histogram() +
    scale_y_continuous(expand = c(0,0)) +
    geom_vline(aes(xintercept = mean(histVar)), colour = 'red',
               size = 1) +
    ggtitle(graphTitle) +
    xlab(xAxis) +
    ylab(yAxis) +
    annotate("text", x = mean(histVar)*1.8,
             y = mean(histVar) - mean(histVar) * 0.1,
             label = paste("Mean:",round(mean(histVar),0)),
             colour = 'red') +
    theme_gdocs() +
    scale_colour_gdocs() +
    theme(axis.title.y = element_text(angle = 90),
          plot.margin = unit(c(5,5,5,5),"mm"))

  # Return
  return(hist_plot)
}

当我尝试运行代码时:

> data(mtcars)
> GenerateHistogram(histogramVariable = "disp", dataSet = mtcars,
+                   graphTitle = "Disp", xAxis = "X title", yAxis = "y Title")

我收到以下错误:

Error in get(paste(deparse(substitute(dataSet)), histogramVariable, sep = "$"),  : 
  object 'mtcars$disp' not found
Called from: get(paste(deparse(substitute(dataSet)), histogramVariable, sep = "$"), 
    envir = parent.frame(), inherits = TRUE)

问题出现在声明中:

  histVar <- get(paste(deparse(substitute(dataSet)), histogramVariable,
                       sep = "$"), envir = parent.frame(),
                 inherits = TRUE)

任务

我想实现以下目标:

  1. 将参数传递给ggplot以生成图表; aes_string 似乎是一个合适的解决方案,这部分正在运作

  2. 从调用函数的环境中按名称来源参数,这样我就可以对该变量做不同的事情,比如计算我添加到柱状图中的铃铛和哨子的值

    2.1我可以通过添加机制来明智地计算箱子大小或修改值来进一步开发这个功能,将值作为数字向量访问将非常方便

  3. 目标

    总之,该功能有两个简单的目标:

    • 使用ggplot
    • 作为aes_string直方图 - 实现的包装工具
    • 为直方图变量提供额外计算的余地,目前尚未完成

    编辑

    以下非常有用的评论,我试过:

      # Get the histogram value as indicator
      relevant_column <- histogramVariable
      histVar <- dataSet[,relevant_column]
    

    似乎产生错误:

      

    Error in mean(histVar) : object 'histVar' not found

1 个答案:

答案 0 :(得分:4)

我认为有很多方法可以解决这个问题,而不涉及范围界定。这是一个,我在函数内部生成了一个额外的数据框,包含均值并将其传递给geom_vline。这可能是一种更优雅的方式,但这种方式可以让你进行大量的控制和自己的计算方法(减少黑盒子)。

我已删除了所有其他格式,专注于解决方案。

GenerateHistogram <- function(histogramVariable="disp", dataSet=mtcars,
                              graphTitle = "Graph Title",
                              xAxis = "Count",
                              yAxis = "x axis title") {


  #generate additional/summarizing data
  #this gives you a dataframe you can feed to geom_vline,
  #so more control and no scoping issues
  add_data <- data.frame(mean=mean(dataSet[,histogramVariable]))

  # Plot definition
  hist_plot <- ggplot(data = dataSet, aes_string(x = histogramVariable)) +
    geom_histogram() +
    geom_vline(data=add_data, aes(xintercept=mean))

    # Return
    return(hist_plot)
}

编辑:我做了一些调查,因为在使用这个解决方案时有点费力。这里的问题是使用字符串作为变量,因此对于没有附加数据的geom_vline,您可以这样做:

geom_vline(aes_string(xintercept=sprintf("mean(%s)",histogramVariable)))