2017-10-08 3 views
0

J'essaye d'écrire une fonction qui crée des graphiques et qui a rencontré une erreur que je ne comprends pas. Voici un exemple simplifié.Comment écrire une fonction qui passe NULL à ggplot sans erreur esthétique

exemple Reproductible:

library (ggplot2) 
# Sample data 
xdata = 0:20 
ydata = 20:40 
dat <- data.frame(xdata, ydata) 

# This works 
line_p <- ggplot(dat, aes(x = xdata, y = ydata, group = NULL, color = NULL)) + geom_line() 
line_p 

J'attend ce qui suit à travailler, mais je reçois une erreur d'esthétique, mais dans ce cas les variables x et y sont de la même longueur. Les problèmes semblent avoir une valeur par défaut de NULL pour le groupe et la couleur. J'ai également essayé de passer explicitement NULL avec aes_group et aes_color en tant que variables de fonction, mais cela ne fonctionnait pas non plus.

# Using a function doesn't work: 

# create function 
line_function <- function(mydata  = dat, 
          xinput  = x, 
          yinput  = y, 
          aes_group = NULL, 
          aes_color = NULL, 
          ...) { 

    lineplot <- ggplot(dat, aes(x = xinput, y = yinput, group = aes_group, color = aes_color)) + geom_line() 
} 


# test the function 
line_test_p <- line_function(
    mydata = dat, 
    xinput = xdata, 
    yinput = ydata 
) 

line_test_p 

test avec des entrées explicites

# test the function again with explicit NULL inputs 

line_test2_p <- line_function(
    mydata = dat, 
    xinput = xdata, 
    yinput = ydata, 
    aes_group = NULL, 
    aes_color = NULL 
) 

line_test2_p 

est-il pas possible d'écrire une fonction générique où ggplot interprétera les valeurs NULL comme dans l'exemple qui fonctionne sans fonction, ou suis-je manque quelque chose d'autre ?

Merci!

Répondre

0

En résumé, vous devez rechercher aes_string pour créer des mappages esthétiques par programme. Il vous permet de créer des mappages esthétiques en utilisant les noms des variables stockées dans les chaînes. De cette façon, il est facile de passer des noms de colonnes en tant qu'arguments à une fonction et de créer le tracé correspondant.

La version suivante de votre fonction fonctionne pour moi:

# create function 
line_function <- function(mydata  = dat, 
          xinput  = "x", # note the defaults are 
          yinput  = "y", # strings here 
          aes_group = NULL, 
          aes_color = NULL, 
          ...) { 

    ggplot(mydata, # this should be the argument, not the global variable dat 
     # now we create the aes binding with aes_string 
     aes_string(x = xinput, 
        y = yinput, 
        group = aes_group, 
        color = aes_color)) + 
    geom_line() 
} 

Et vous pouvez maintenant utiliser la fonction pour créer vos exemples:

# test the function 
line_test_p <- line_function(
    mydata = dat, 
    xinput = "xdata", # note the strings 
    yinput = "ydata" 
) 

# test the function again with explicit NULL inputs 
line_test2_p <- line_function(mydata = dat, 
           xinput = "xdata", # and strings here 
           yinput = "ydata", 
           aes_group = NULL, 
           aes_color = NULL) 

Et les choses devraient fonctionner pour vous. Encore une fois, consultez le documentation, car il existe différentes façons d'y parvenir, et vous pouvez préférer différentes manières pour différents objectifs ou préférences.

+0

Andrew, c'est ça, merci. Le changement le plus simple après avoir lu la documentation était de changer la ligne lineplot à: ** lineplot <- ggplot (mydata, aes_ (x = xinput, y = yinput, groupe = aes_group, color = aes_color)) + geom_line() ** I aussi devrait avoir utilisé ** mydata ** comme variable dans la fonction comme vous l'avez mentionné, pas ** dat ** – DaveM