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

Accessing objects from global environment that are directly passed to the function in a wrapper for ggplot

我正在为 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 我可能会通过添加机制来进一步开发此功能以明智地计算 bin 大小或修改值,将值作为数字向量访问将非常方便

目标

总之,该函数有两个简单的目标:


编辑

根据非常有用的评论,我尝试了:

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

这似乎产生了错误:

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

我认为有多种不涉及范围界定的方法可以解决这个问题。这是一个,我在函数内生成了一个包含均值的附加数据框,并将其传递给 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)))