2015-02-20 1 views
2

Я пытаюсь скомпоновать функцию, которая ведет себя как функция ggplot, а также возвращает объект ggplot, над которым могут работать другие функции (добавление граней, применение тема и т. д.).Возможность указать функцию ggplot для функции, которая должна возвращать объект ggplot

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

data(iris) 
te <- function(data,x,y){ 

    g <- ggplot(data,aes_q(x=quote(x),y=quote(y))) + scale_x_continuous() + 
    scale_y_continuous() + geom_point() 
    return(g) 

} 
te(iris,x=Species,y=Petal.Length) 

Что я тогда:

Error: geom_point requires the following missing aesthetics: x, y 

Я надеялся, что это позволит мне передать аргументы не как строки, но очевидно, что я делаю что-то здесь не так. Для меня странно, что geom_point - это функция, которая жалуется. Как так?

ответ

2

Внутри функции вы должны использовать substitute вместо quote:

data(iris) 
te <- function(data,x,y){ 

    x <- substitute(x) 
    y <- substitute(y) 
    g <- ggplot(data,aes_q(x=x,y=y)) + scale_x_discrete() + 
    scale_y_continuous() + geom_point() 
    return(g) 

} 
te(iris,x=Species,y=Petal.Length) 

Это будет работать идеально.

P.S. Я изменил scale_x_continuous к scale_x_discrete потому Видовой дискретно

enter image description here

2

Попробуйте quote при вызове функции:

data(iris) 
library(ggplot2) 
te <- function(data,x,y){ 
    g <- ggplot(data,aes_q(x,y)) + scale_x_continuous() + 
    scale_y_continuous() + geom_point() 
    return(g) 

} 
te(iris,x=quote(Species),y=quote(Petal.Length)) 
Смежные вопросы