Подтвердить что ты не робот

Передача параметров 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-вопросах (например, этот), но без предоставления, на мой взгляд, удовлетворительного ответа. Как изменить функцию выше, чтобы заставить ее работать с произвольными кадрами данных?

4b9b3361

Ответ 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