Функция диаграммы рассеяния, которая может изменяться в зависимости от переменных для осей - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь написать функцию, которая кажется очень простой, но у меня с ней возникают проблемы. Я хочу написать функцию, которая принимает три аргумента: фрейм данных, переменную оси x и переменную оси y. На основе этого я хочу, чтобы он возвращал диаграмму рассеяния, в которой можно изменять переменную оси x и переменную оси y. Это самая основная c функция, которую я написал:

scatter_plot <- function(dataframe, x_input, y_input) {
  plot <- ggplot(data = dataframe) +
    geom_point(mapping = aes(x = x_input, y = y_input),
    )
}

Для воспроизводимости рассмотрите набор данных midwest, который находится в пакете ggplot2. Написанный мной код не вызывает ошибок, когда я запускаю его, но когда я пытаюсь передать в него аргументы, такие как

scatter_plot(midwest, percollege, percpovertyknown)

, функция возвращает

" Ошибка в FUN (X [[i]], ...): объект 'percollege' не найден"

Похоже, он не распознает переменные в аргументе, но я довольно долго экспериментировал с функцией, и я не могу понять ее. Может ли кто-нибудь помочь мне исправить это, чтобы моя функция работала правильно?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

tidyverse использует нестандартную оценку (NSE), что делает использование его возможностей в функциях немного сложнее, чем вы ожидаете. Вот версия вашей функции, которая подходит мне.

scatter_plot <- function(dataframe, x_input, y_input) {
  qX <- enquo(x_input)
  qY <- enquo(y_input)
  plot <- ggplot(data = dataframe) +
    geom_point(mapping = aes(x = !! qX, y = !! qY),
    )
  return(plot)
}

Поскольку вы назначили свой график объекту, я добавил оператор return.

См. здесь для получения дополнительной информации о NSE.

0 голосов
/ 29 мая 2020

Использование !!rlang::ensym() в вашей функции должно работать.

scatter_plot <- function(dataframe, x_input, y_input) {
  plot <- ggplot(data = dataframe) +
    geom_point(mapping = aes(x = !!rlang::ensym(x_input), y = !!rlang::ensym(y_input)))
  plot
}

Пример

scatter_plot(midwest, percollege, percpovertyknown)

enter image description here

...