34 votos

Las Variables locales Dentro de aes

Estoy tratando de utilizar una variable local en aes cuando me parcela con ggplot. Este es mi problema se reducía a la esencia:

xy <- data.frame(x=1:10,y=1:10)

plotfunc <- function(Data,YMul=2){
    ggplot(Data,aes(x=x,y=y*YMul))+geom_line()
}

plotfunc(xy)

Esto produce el siguiente error:

Error in eval(expr, envir, enclos) : object 'YMul' not found

Parece como si no puedo utilizar variables locales (o de argumentos de la función) en aes. Podría ser que esto se produce debido a que el contenido de aes siendo ejecutado más tarde, cuando la variable local está fuera de su alcance? ¿Cómo puedo evitar este problema (aparte de no usar la variable local dentro de aes)?

32voto

baptiste Puntos 19677

Me gustaría capturar el entorno local,

xy <- data.frame(x=1:10,y=1:10)

plotfunc <- function(Data, YMul = 2){
    .e <- environment()
    ggplot(Data, aes(x = x, y = y*YMul), environment = .e) + geom_line()
}

plotfunc(xy)

9voto

Josh O'Brien Puntos 68397

He aquí una alternativa que le permite pasar cualquier valor a través de la YMul argumento, sin tener que añadir a la Data de datos.marco o el medio ambiente mundial:

plotfunc <- function(Data, YMul = 2){
    eval(substitute(
        expr = {
            ggplot(Data,aes(x=x,y=y*YMul)) + geom_line()
        }, 
        env = list(YMul=YMul)))
    }

plotfunc(xy, YMul=100)

Para ver cómo funciona, pruebe la siguiente línea en el aislamiento:

substitute({ggplot(Data, aes(x=x, y=y*YMul))}, list(YMul=100))

4voto

jthetzel Puntos 2349

ggplot()'s aes espera YMul a ser una variable dentro de la data marco de datos. Intentar incluyendo YMull ahí:

Gracias a @Justin: ggplot()'s aes parece mirar paraYMul en la data datos del primer cuadro, y si no se encuentra, entonces, en el medio ambiente global. Me gustaría añadir variables a la trama de datos, de la siguiente manera, como es lógico para mí conceptualmente. Yo también no tiene que preocuparse acerca de los cambios en las variables globales de tener consecuencias inesperadas para las funciones. Pero todas las otras respuestas son también correctas. Así, el uso de cualquiera que se adapte a usted.

require("ggplot2")
xy <- data.frame(x = 1:10, y = 1:10)
xy <- cbind(xy, YMul = 2)

ggplot(xy, aes(x = x, y = y * YMul)) + geom_line()

O, si desea que la función en el ejemplo:

plotfunc <- function(Data, YMul = 2)
{
    ggplot(cbind(Data, YMul), aes(x = x, y = y * YMul)) + geom_line()
}

plotfunc(xy)

1voto

BBrill Puntos 414

Has mirado en la solución dada por @wch (W. Chang)?

https://github.com/hadley/ggplot2/issues/743

Creo que es la mejor

esencialmente es como la de @baptiste, pero incluye la referencia al medio ambiente directamente en la llamada a ggplot

Me informe aquí

g <- function() {
  foo3 <- 4
  ggplot(mtcars, aes(x = wt + foo3, y = mpg),
         environment = environment()) +
    geom_point()
}

g()
# Works

0voto

Justin Puntos 19077

Si ejecuta su código fuera de la función funciona. Y si se ejecuta el código dentro de la función con YMul define de forma global, funciona. No entiendo bien el funcionamiento interno de ggplot pero esto funciona...

YMul <- 2

plotfunc <- function(Data){
    ggplot(Data,aes(x=x,y=y*YMul))+geom_line()
}

plotfunc(xy)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X