ggplot2找不到对象错误

时间:2011-04-01 13:52:58

标签: r ggplot2

我无法理解这一点。

这些例子正在运作:

# 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

3 个答案:

答案 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(...
    ...
}