web-dev-qa-db-fra.com

argument non numérique en opérateur binaire

J'essaie de créer ma première fonction dans R. La fonction doit prendre en charge une trame de données, une série x à partir d'une trame de données, une série y à partir d'une trame de données et tracer un diagramme de dispersion. Cela semble assez simple, mais je rencontre des problèmes lorsque je tente de rechercher 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
Jefftopia

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

26
Christopher Louden

La réponse de Christopher est parfaitement correcte. Permettez-moi d'ajouter que ggplot semble également accepter les 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, ) génère une erreur dans R. Ceci est la raison de la finale NULL, qui est heureusement ignoré par ggplot2.

Une autre solution consiste à écrire

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

La dernière list() est supposée rester en place pour annuler les effets du dernier signe +; c'est un non-op autrement.

20
krlmlr

Avec la version 2.0.0, ggplot2 A gagné une nouvelle géométrie, geom_blank() qui ne dessine 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()

Utiliser geom_blank() de cette manière est similaire à la solution de contournement de réponse de @ krlmlr qui utilise list() comme dernière couche.

5
Uwe