长期读者,第一次写作问题...我有一个函数可以输入数据并使用一些特定的格式输出ggplot2直方图。我正在尝试编辑此函数,以便其中一个函数参数可以指定我是否希望直方图显示数据的频率或密度。我知道我可以分别在geom_histogram()
函数内手动指定aes(y=..count..)
或aes(y=..density..)
。但是,如果没有直接输入这些变量,我就会遇到问题。
以下是我尝试做的简化版本:
library(ggplot2)
histplot <- function(data,density=FALSE) {
if (density) {
type <- "..density.."
} else {
type <- "..count.."
}
theplot <- ggplot(data, aes(x=data[,1])) +
geom_histogram(position="identity",binwidth = 2,
aes(y=eval(parse(text=type))))
g <- ggplot_gtable(ggplot_build(theplot))
grid.draw(g)
}
xy <- data.frame(X=rnorm(100,0,10),Y=rnorm(100))
histplot(xy)
当我执行此函数时,我得到的错误是:
Error in eval(expr, envir, enclos) : object '..count..' not found
我无法弄清楚为什么这不起作用,因为如果我做了类似以下的事情:
x <- 1:5
y <- "x"
eval(parse(text=y))
然后输出
[1] 1 2 3 4 5
我的猜测是它与环境有关。
答案 0 :(得分:2)
我相信你可以在这种情况下使用aes_string
,所以这样的事情应该起作用
type="..count.."
ggplot(xy, aes_string(x=xy[,1], y=type)) +
geom_histogram(position="identity",binwidth = 2)