从全局环境访问对象,这些对象直接传递给 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)
任务
我想实现以下目标:
将参数传递给 ggplot
以生成图表; aes_string
似乎是一个合适的解决方案,这部分正在运行
从调用函数的环境中按名称获取参数,这样我就可以对该变量做不同的事情,例如计算要添加到直方图中的花哨值
2.1 我可能会通过添加机制来进一步开发此功能以明智地计算 bin 大小或修改值,将值作为数字向量访问将非常方便
目标
总之,该函数有两个简单的目标:
- 作为
ggplot
直方图的包装器 - 使用 aes_string
实现了
- 为直方图变量的额外计算提供范围,目前未完成
编辑
根据非常有用的评论,我尝试了:
# 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)))
我正在为 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)
任务
我想实现以下目标:
将参数传递给
ggplot
以生成图表;aes_string
似乎是一个合适的解决方案,这部分正在运行从调用函数的环境中按名称获取参数,这样我就可以对该变量做不同的事情,例如计算要添加到直方图中的花哨值
2.1 我可能会通过添加机制来进一步开发此功能以明智地计算 bin 大小或修改值,将值作为数字向量访问将非常方便
目标
总之,该函数有两个简单的目标:
- 作为
ggplot
直方图的包装器 - 使用aes_string
实现了
- 为直方图变量的额外计算提供范围,目前未完成
编辑
根据非常有用的评论,我尝试了:
# 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)))