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

j'essaie de créer ma première fonction en R. La fonction devrait prendre une base de données, X-série à partir de la base de données, y-série à partir de la base de données, et tracer un nuage de points. Cela semble assez simple, mais je rencontre des problèmes quand je tente de vérifier un argument booléen optionnel.

R Script

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

Extra

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

25
demandé sur zx8754 2014-02-04 22:25:28
la source

3 ответов

l'erreur est due à l'arrière + après geom_point(). Supprimer cela et cela devrait fonctionner.

26
répondu Christopher Louden 2014-02-04 22:28:25
la source

la réponse de Christopher est parfaitement correcte. Permettez-moi d'ajouter que ggplot semble aussi 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, ], de la construction list(1, 2, 3, ) produit une erreur en R. C'est la raison pour laquelle leNULL, 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()

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

19
répondu krlmlr 2016-02-05 19:31:59
la source

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() dans cette voie est similaire à la solution de contournement dans la réponse [email protected] qui utilise list() comme dernière couche.

4
répondu Uwe 2017-05-23 14:46:19
la source

Autres questions sur