R不一致:为什么add = T有时可以工作,有时候不在plot()函数中?

TMS*_*TMS 47 plot r add

为什么R与函数中的add参数不一致plot()?它有时会起作用,有时却不起作用!在这个例子中,它使参数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))
Run Code Online (Sandbox Code Playgroud)

但是当我发出

plot(c(2, 3, 4), c(20,10,15), add=TRUE, pch="A")
Run Code Online (Sandbox Code Playgroud)

它不起作用!! 它说"添加"不是图形参数.

请不要写我应该使用的points().我知道我可以用它.我想了解R的奇怪行为 - 为什么它有时有效,有时不行?

Ben*_*ker 37

这无疑是烦人且不一致的,但它是可以解释的.

编辑:这identity是一个内置对象(身份函数)的事实让我望而却步(因此问题实际上是可重现的).

identity是一个类的一个对象- function-具有plot方法(plot.function)与add参数,而默认的plot方法并具有add参数.

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


nul*_*lob 27

这是因为当你打电话plot(0:10, 0:10*3)或者plot(c(2, 3, 4), c(20,10,15))你是间接打电话时,你plot.default()打电话plot.xy(),而你提到的其他两个电话正在运行plot.function().add是一个论据plot.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
Run Code Online (Sandbox Code Playgroud)

正如Ben Bolker所提到的,methods('plot')将向您展示在运行时可以调用哪些方法plot()- 不同的方法具有不同的参数,这些参数在您调用时args(plot.foo)或在帮助页面中列出?plot.foo