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

pourquoi R est-il incompatible avec le add paramètre plot() fonction? Cela fonctionne parfois et parfois ne pas! 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'question

plot(c(2, 3, 4), c(20,10,15), add=TRUE, pch="A")

ça ne marche pas!! Il est dit que "ajouter" n'est pas un paramètre graphique.

Merci de ne pas écrire que je dois utiliser points() à la place. Je sais que je peux l'utiliser. Je veux comprendre le comportement étrange de R-pourquoi le fait parfois travail et parfois pas?

41
demandé sur TMS 2011-07-22 15:04:00

2 réponses

C'est certes ennuyeux et incohérent, mais c'est explicable.

modifier: le fait que identity est un objet intégré (fonction identité) m'a échappé (de sorte que le problème est en fait reproductible).

identity est un objet d'une classe -- function -- qui a un plot méthode (plot.function) avec add argument, alors que la valeur par défaut plot la méthode fait add argument.

En général, quand essayer de tracer l'objet bar, vous devriez essayer class(bar); si elle est de classe foo ensuite, essayez methods(class="foo") pour voir qu'il a une parcelle d'une méthode ou d' methods("plot") voir plot.foo existe. Essayez ?plot.foo voir l'aide, ou plot.foo ou getAnywhere(plot.foo) voir la fonction elle-même.

33
répondu Ben Bolker 2011-07-25 15:13:27

C'est parce que 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 appels que vous mentionnez sont en cours d'exécution plot.function(). add est un argument pour plot.function(), mais pas pour plot.xy().

vous pouvez contourner cette incohérence en positionnant par(new = TRUE), mais ensuite vous devez vous assurer que vous n'ajoutez pas de nouvelles étiquettes axiales ou redessinez les axes. EDIT: Comme indiqué dans le commentaire, vous devez vous assurer que la gamme est le même que le graphique précédent. 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 énumérés lorsque vous appelez args(plot.foo) ou dans la page d'aide ?plot.foo

24
répondu nullglob 2011-07-31 13:36:05