我无法理解这一点。
这些例子正在运作:
# Function with geom_density
gr.den <- function(var.name) {
ggplot(results, aes(get(var.name), fill = name)) +
geom_density(alpha = 0.2) +
geom_vline(xintercept = tv[, var.name], color="red", size=1) +
xlab(var.name)
}
gr.den("sum.Empl")
# Example with geom_point
ggplot(results, aes(sum.All, sum.Empl)) +
geom_point(alpha = 1/5) +
opts(aspect.ratio = 1) +
facet_grid(. ~ name)
然后我尝试使用geom_point创建类似的功能:
gr.sc <- function(var.name.1, var.name.2) {
ggplot(results, aes(get(var.name.1), get(var.name.2))) +
geom_point(alpha = 1/5) +
opts(aspect.ratio = 1) +
facet_grid(. ~ name)
}
gr.sc("sum.All", "sum.Empl")
我收到了这个错误。为什么呢?
Error in get(var.name.1) : object 'var.name.1' not found
答案 0 :(得分:18)
如果要在函数中使用aes,最好使用aes_string。
gr.sc <- function(var.name.1, var.name.2) {
ggplot(results, aes_string(x = var.name.1, y = var.name.2)) +
geom_point(alpha = 1/5) +
opts(aspect.ratio = 1) +
facet_grid(. ~ name)
}
gr.sc("sum.All", "sum.Empl")
HTH
答案 1 :(得分:5)
发生错误是因为get
正在查找错误的环境(即不在results
数据框内)。您可以明确指定get(var.name.1, envir = results)
,但这将是丑陋,糟糕的代码。正如Iselzer建议的那样,使用aes_string
要好得多。
答案 2 :(得分:1)
我遇到了与此类似的问题:https://groups.google.com/forum/#!topic/ggplot2/_kKP4NNu3bc 其中aes_string不起作用。
这可能会在ggplot2的更高版本中解决。但出于兼容性原因,我使用的是较旧版本的ggplot2。对我有用的快速黑客是将函数参数设置为全局变量,即
gr.sc <- function(var.name.1, var.name.2) {
var.name.1 <<- var.name.1
...
ggplot(...
...
}