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.
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)
non-numeric argument to binary operator
D'autres suggestions pour améliorer cette fonction sont les bienvenues.
L'erreur est due à la fin +
Après geom_point()
. Supprimez cela et cela devrait fonctionner.
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.
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.