当我尝试将参数传递到stat_summary
中的round
函数时(即使类似的代码使用,说,geom_text
)。这里有一个例子:ggplot2:stat_summary在尝试传递函数参数作为参数时抛出错误,而不是硬编码
# Fake data
set.seed(5)
dat = data.frame(group=rep(c("A","B"),each=10), val=rnorm(20))
我们将尝试使用参数,设定位小数值标签的数量,而不是硬编码:
places = 2
ggplot(dat, aes(group, val)) +
stat_summary(fun.y=mean, geom="text", aes(label=round(..y.., places)))
错误的eval(表达式,envir,enclos):找不到对象“地方”
但是,以下两个示例可以正常工作。
ggplot(dat, aes(group, val)) +
stat_summary(fun.y=mean, geom="text", aes(label=round(..y.., 2)))
ggplot(dat, aes(group, val)) +
geom_text(aes(label=round(val, places)))
我试图写一个ggplot函数时遇到了这个问题。起初我认为这个问题涉及ggplot没有从函数环境中获取参数,但上面的例子表明这不是问题。为了完整起见,下面是该函数的简单示例以及错误消息。如果我将数字参数硬编码为round
,而不是尝试通过places
参数,则该函数可以正常工作。
pp1 = function(data, group, var, places=2, e=1.5) {
ggplot(data, aes_string(group, var)) +
geom_boxplot() +
stat_summary(fun.y=mean, geom="text", aes(label=round(..y.., places))) +
scale_y_continuous(limits = e * range(data[,var]))
}
pp1(dat, "group","val")
错误的eval(表达式,ENVIR,enclos):对象“地方”未找到
,我希望能找到我是否做错了什么以及我如何获得理想的行为。
我正在运行R
3.2.3和ggplot2
2.1.0在OS X 10.10.5上。
它看起来像一个NSE问题。你可以通过调用'eval(代替(... ggplot code ...,list(places = places)))'来躲避它,尽管可能有更好的方法。 – alistaire
工作。请添加它作为答案。你知道为什么它发生在'stat_summary'内部而不是在其他地方? – eipi10
我不确定;这是关于'aes'中的NSE如何工作的。也许它会被'..y..'打开?有一个名为'aes_'的SE版本,但我不知道如何让'..y..'参数在其中工作。我会在上面发布一个答案,我会在第二个答案中找到其他答案。 – alistaire