2017-07-31 2 views
0

Je suis en train de créer un wrapper autour de la ggplot qui me permet d'ajouter quelques esthétiques comme la variable x ou couleur, mais prefills toujours y, ymin et ymax sans avoir à travailler avec des noms de variables entre guillemets.points Mix et arguments nommés en fonction appelant aes pour ggplot2

Depuis ggplot2 ne peut pas utiliser l'évaluation propre que je dois utiliser NSE pour cela, mais je suis bloqué, les informations que je puisse trouver here et here et inspecter certaines fonctions m'a fait essayer des choses comme unlist(...) et travailler avec match.call(). mais ils ne jettent que des erreurs différentes.

Dans la fonction ci-dessous je essentiellement aime être en mesure d'appeler ci_plot() ou par exemple ci_plot(color = cyl)

library(dplyr) 
library(ggplot2) 
library(purrr) 
library(tidyr) 


ci_plot <- function(data, ...) { 
    ggplot(data, aes(..., y = y, ymin = ymin, ymax = ymax)) 
} 

mpg %>% 
    group_by(manufacturer) %>% 
    nest() %>% 
    mutate(x = map(data, ~mean_se(.x$hwy))) %>% 
    unnest(x) %>% 
    ci_plot() + 
    geom_pointrange() 
+0

cela pourrait aider: https://stackoverflow.com/questions/15458526/r-pass-variable-column-indices-to -ggplot2 – Wave

Répondre

0

Après un peu plus creuser j'ai trouvé la réponse de l'ombre here et compris comment l'adapter à mon but. Je vais essayer de décrire la solution autant que je le comprends.

ci_plot <- function(data, ...) { 
    # Create a list of unevaluated parameters, 
    # removing the first two, which are the function itself and data. 
    arglist <- as.list(match.call()[-c(1,2)]) 

    # We can add additional parameters to the list using substitute 
    arglist$ymin = substitute(ymin) 
    arglist$y = substitute(y) 
    arglist$ymax = substitute(ymax) 

    # I suppose this allows ggplot2 to recognize that it needs to quote the arguments 
    myaes <- structure(arglist, class="uneval") 

    # And this quotes the arguments? 
    myaes <- ggplot2:::rename_aes(myaes) 

    ggplot(data, myaes) 
} 

Cette fonction me permet d'écrire le code comme celui-ci

mpg %>% 
    group_by(manufacturer, cyl) %>% 
    nest() %>% 
    mutate(x = map(data, ~mean_se(.x$hwy))) %>% 
    unnest(x) %>% 
    ci_plot(x = cyl, color = manufacturer) + 
    geom_pointrange() 
1

Vous avez un couple d'options, selon la façon dont vous voulez que l'utilisateur soit en mesure de transmettre les variables à la fonction.

Utilisation des chaînes et aes_string

Vous pourriez avoir l'utilisateur donne des variables via des chaînes. Dans ce cas, vous voulez que ... dans aes_string puis ajoutez une couche distincte aes pour les variables "fixes".

Votre code de manipulation de données renvoyait tous NA pour moi, donc cet exemple est plus simple. J'ai corrigé la variable y pour qu'elle soit cty.

ci_plot = function(data, ...) { 
    ggplot(data, aes_string(...)) + 
      aes(y = cty) 
} 

ci_plot(data = mpg, x = "displ", color = "class") + 
    geom_point() 

Utilisation tilde et aes_

Une alternative est d'avoir l'usage de l'utilisateur tilde pour les variables lors de l'utilisation de la fonction. Dans ce cas, aes_ peut être utilisé pour les variables fixes et variables.

ci_plot2 = function(data, ...) { 
    ggplot(data, aes_(..., y = ~cty)) 
} 

ci_plot2(data = mpg, x = ~displ, color = ~class) + 
    geom_point() 

L'intrigue résultant des deux fonctions: enter image description here

+0

Merci pour la réponse complète. Cependant je cherchais des manières de garder la même syntaxe que pour les autres fonctions ggplot2 de vanilla, sans guillemets (je ne l'ai probablement pas assez souligné). J'ai réussi à résoudre le problème maintenant et j'ai posté une réponse si vous êtes intéressé. –