Pourquoi R n'est-il pas cohérent avec le paramètre add
dans la fonction plot()
? Cela fonctionne parfois et parfois non! Dans cet exemple, il prend le paramètre add=TRUE
Sans problème:
plot(0:10, 0:10*3)
plot(identity, add=TRUE, xlim=c(0,10))
plot(function (x) { sin(x)*10 }, add=TRUE, xlim=c(0,10))
Mais quand j'émets
plot(c(2, 3, 4), c(20,10,15), add=TRUE, pch="A")
Ça ne marche pas !! Il indique que "ajouter" n'est pas un paramètre graphique.
N'écrivez pas que je devrais utiliser points()
à la place. Je sais que je peux l'utiliser. Je veux comprendre l'étrange comportement de R - pourquoi ça marche parfois et parfois non?
C'est certes ennuyeux et incohérent, mais c'est explicable.
edit: le fait que identity
est un objet intégré (fonction d'identité) m'a échappé (donc le problème est en fait reproductible).
identity
est un objet d'une classe - function
- qui a une méthode plot
(plot.function
) avec un argument add
, tandis que la méthode par défaut plot
n'a pas un argument add
.
En général, lorsque vous essayez de tracer l'objet bar
, vous devez essayer class(bar)
; s'il s'agit de la classe foo
alors essayez methods(class="foo")
pour voir qu'il a une méthode de tracé, ou methods("plot")
pour voir que plot.foo
existe. Essayez ?plot.foo
Pour voir l'aide, ou plot.foo
Ou getAnywhere(plot.foo)
pour voir la fonction elle-même.
En effet, lorsque vous appelez plot(0:10, 0:10*3)
ou plot(c(2, 3, 4), c(20,10,15))
, vous appelez indirectement plot.default()
, qui à son tour appelle plot.xy()
, tandis que les deux autres les appels que vous mentionnez exécutent plot.function()
. add
est un argument pour plot.function()
, mais pas pour plot.xy()
.
Vous pouvez contourner cette incohérence en définissant par(new = TRUE)
, mais vous devez ensuite vous assurer de ne pas ajouter de nouvelles étiquettes d'axe ou de redessiner les axes. EDIT: Comme indiqué dans le commentaire, vous devez vous assurer que la plage est la même que l'intrigue précédente. par exemple.:
plot(0:10, 0:10*3)
plot(identity, add=T, xlim=c(0,10))
plot(function (x) { sin(x)*10 }, add=T, xlim=c(0,10))
par(new = TRUE)
plot(c(2, 3, 4), c(20,10,15), pch="A",
axes = FALSE, ## don't redraw the axes
xlab = '', ylab = '', ## no fresh axis labels
xlim = c(0,10), ylim = c(0,30)) ## keep the same limits as before
Comme le mentionne Ben Bolker, methods('plot')
vous montrera quelles méthodes peuvent être appelées lors de l'exécution de plot()
- les différentes méthodes ont des arguments différents, qui sont répertoriés lorsque vous appelez args(plot.foo)
ou dans la page d'aide ?plot.foo