R的不一致性:为什么add = T有时会起作用,有时不在plot()函数中?

为什么R与plot()函数中的add参数不一致? 它有时有效,有时不起作用! 在这个例子中,参数add=TRUE没有问题:

 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)) 

但是当我问题

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

它不工作! 它说“添加”不是一个graphics参数。

请不要写我应该使用points()来代替。 我知道我可以使用它。 我想了解R的奇怪行为 – 为什么它有时会起作用,有时候不行?

这固然令人讨厌和不一致,但它是可以解释的。

编辑identity是一个内置的对象(身份函数)逃避我的事实(所以这个问题实际上是可重现的)。

identity是类的一个对象 – function – 有一个add参数的plot方法( plot.function ),而默认的plot方法没有add参数。

一般来说,当试图绘制对象bar ,你应该尝试class(bar) ; 如果是类foo则尝试使用methods(class="foo")来查看它是否有plot方法,或者使用methods("plot")来查看plot.foo存在。 尝试?plot.foo来查看帮助,或者plot.foogetAnywhere(plot.foo)来查看函数本身。

这是因为当你调用plot(0:10, 0:10*3) plot(c(2, 3, 4), c(20,10,15)) plot(0:10, 0:10*3)plot(c(2, 3, 4), c(20,10,15)) ,你间接调用了plot.default() ,然后调用plot.xy() ,而您提到的另外两个调用正在运行plot.function()addplot.function()的参数,但不是plot.xy()

你可以通过设置par(new = TRUE)来解决这个不一致问题,但是你需要确保你不要添加新的轴标签或者重绘轴。 编辑:正如在评论中指出的,你必须确保范围是与前面的情节相同。 例如:

 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 

Ben Bolker提到, methods('plot')会告诉你在运行plot()时可以调用什么方法 – 不同的方法有不同的参数,当你调用args(plot.foo)或者在帮助页面时会列出不同的参数?plot.foo