Передача параметров ggplot
хотел бы создать функцию, которая генерирует графики с помощью ggplot. Для простоты типичный граф может быть
ggplot(car, aes(x=speed, y=dist)) + geom_point()
Функция, которую я хотел бы создать, имеет тип
f <- function(DS, x, y) ggplot(DS, aes(x=x, y=y)) + geom_point()
Это, однако, не будет работать, так как x и y не являются строками. Эта проблема была отмечена в предыдущих SO-вопросах (например, этот), но без предоставления, на мой взгляд, удовлетворительного ответа. Как изменить функцию выше, чтобы заставить ее работать с произвольными кадрами данных?
Ответы
Ответ 1
Одним из решений было бы передать x и y в виде строковых имен столбцов в кадре данных DS.
f <- function(DS, x, y) {
ggplot(DS, aes_string(x = x, y = y)) + geom_point()
}
И затем вызовите функцию как:
f(cars, "speed", "dist")
Однако, похоже, вы этого не хотите? Можете ли вы привести пример, почему вам нужны разные функции? Это потому, что вы не хотите иметь аргументы в одном кадре данных?
Ответ 2
Я думаю, что возможен следующий тип кодов, которые только строят компонент aes
.
require(ggplot2)
DS <- data.frame(speed=rnorm(10), dist=rnorm(10))
f <- function(DS, x, y, geom, opts=NULL) {
aes <- eval(substitute(aes(x, y),
list(x = substitute(x), y = substitute(y))))
p <- ggplot(DS, aes) + geom + opts
}
p <- f(DS, speed, dist, geom_point())
p
Однако это, кажется, сложный подход.
Ответ 3
Другой вариант - использовать do.call. Вот вставка копии одной строки из рабочего кода:
gg <- gg + geom_rect( do.call(aes, args=list(xmin=xValues-0.5, xmax=xValues+0.5, ymin=yValues, ymax=rep(Inf, length(yValues))) ), alpha=0.2, fill=colors )
Ответ 4
Один из подходов, который я могу придумать, - это использовать match.call()
для получения имен переменных, содержащихся в параметрах/аргументах, передаваемых в пользовательскую функцию построения, а затем использовать eval()
для них. Таким образом, вы не будете передавать их как указано в вашей пользовательской функции, если вам это не нравится.
library(ggplot2)
fun <- function(df, x, y) {
arg <- match.call()
ggplot(df, aes(x = eval(arg$x), y = eval(arg$y))) + geom_point()
}
fun(mpg, cty, hwy) # no need to pass the variables (column names) as quoted / as strings
![enter image description here]()