Question argument non numérique à l'opérateur binaire [fermé]


J'essaie de créer ma première fonction dans R. La fonction doit prendre une trame de données, une série x à partir d'une trame de données, une série y d'une trame de données et tracer un nuage de points. Semble assez simple, mais je rencontre des problèmes lorsque je tente de vérifier un argument booléen facultatif.

Script R

plotScatterChart <- function(data,x,y,scale=y,line=FALSE) {

    require(ggplot2)
    data$x <- as.numeric(x)
    data$y <- as.numeric(y)

    plot <- ggplot(data, aes(x, y)) + 
            geom_point() +  # aes(alpha=0.3,color=scale)
            #scale_color_gradient(high="red")

    if(line) {
        plot <- plot + geom_smooth(method="lm") 
    }

    ggsave(file="plot.svg", plot=plot, height=10, width=10)

    return(plot)
}

plotScatterChart(data=iris,x=iris$Petal.Length,y=iris$Petal.Width,line=TRUE)

Erreur

non-numeric argument to binary operator

Supplémentaire

D'autres suggestions pour améliorer cette fonction sont les bienvenues.


25
2018-02-04 18:25


origine


Réponses:


L'erreur est due à la fin + après geom_point(). Supprimez cela et cela devrait fonctionner.


25
2018-02-04 18:28



La réponse de Christopher est parfaitement correcte. Permettez-moi d'ajouter que ggplot semble également accepter des listes:

plot <- ggplot(data, aes(x, y)) +
  list(
    geom_point(),
    aes(alpha=0.3,color=scale),
    scale_color_gradient(high="red"),
    NULL
  )

Malheureusement, contrairement à Python, où vous pouvez écrire [1, 2, 3, ], la construction list(1, 2, 3, ) produit une erreur dans R. C'est la raison de la finale NULL, qui est heureusement ignoré par ggplot2.

Une autre solution possible est d'écrire

plot <- ggplot(data, aes(x, y)) +
  geom_point() +
  #aes(alpha=0.3,color=scale) +
  #scale_color_gradient(high="red") +
  list()

Le final list() est censé rester en place pour annuler les effets de la dernière + signe; c'est un non-op autrement.


19
2018-02-04 18:35



Avec la version 2.0.0, ggplot2 a acquis une nouvelle géométrie, geom_blank() qui ne tire rien.

Il peut être utilisé pour éviter ce type d’erreurs lorsqu’il est placé en dernière couche.

plot <- ggplot(data, aes(x, y)) +
  geom_point() +
  #aes(alpha=0.3,color=scale) +
  #scale_color_gradient(high="red") +
  geom_blank()

En utilisant geom_blank() de cette façon est similaire à la solution de contournement dans @ réponse de krlmlr qui utilise list() comme dernière couche.


4
2018-02-05 09:45