【问题标题】:Object not found error with ggplot2ggplot2找不到对象错误
【发布时间】:2011-04-01 13:52:58
【问题描述】:

我无法理解这一点。

这些例子是有效的:

# 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

【问题讨论】:

  • 请提供一个可重现的例子。看起来我们需要 resultstv 的内容来运行您的代码。运行 dput() 并将结果粘贴到您的问题中。

标签: r ggplot2


【解决方案1】:

如果您要在函数中使用 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

【讨论】:

  • 非常感谢! aes_string 有很大帮助。我在第一个函数gr.den 中也发现了一个错误,并由aes_string 解决。
【解决方案2】:

发生错误是因为 get 正在查看错误的环境(即,不在 results 数据框内)。您可以显式指定get(var.name.1, envir = results),但这将是丑陋、糟糕的代码。正如 Iselzer 所建议的那样,使用 aes_string 会更好。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题: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(...
        ...
    }
    

    【讨论】: