web-dev-qa-db-fra.com

R incohérence: pourquoi add = T fonctionne parfois et parfois pas dans la fonction plot ()?

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?

48
TMS

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.

36
Ben Bolker

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

27
nullglob