Объект не найден ошибка с ggplot2 - PullRequest
9 голосов
/ 01 апреля 2011

Я не могу разобраться с этим.

Эти примеры работают:

# 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 ]

18 голосов
/ 01 апреля 2011

Если вы собираетесь использовать 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

5 голосов
/ 01 апреля 2011

Ошибка возникает из-за того, что get ищет в неправильной среде (т.е. не внутри фрейма данных results). Вы могли бы явно указать get(var.name.1, envir = results), но это был бы ужасный, ужасный код. Намного лучше использовать aes_string, как предлагает Изельзер.

1 голос
/ 14 января 2016

У меня возникли проблемы, подобные этой: 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(...
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...