R不一致性:为什么add=T有时在plot()函数中起作用,有时不起作用?
为什么R与R不一致性:为什么add=T有时在plot()函数中起作用,有时不起作用?,r,plot,add,R,Plot,Add,为什么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") 它不起作用!!它说“添加”不是一
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")
它不起作用!!它说“添加”不是一个图形参数
请不要写我应该使用points()
。我知道我可以用它。
我想了解R的奇怪行为——为什么有时有效,有时无效?这是公认的恼人和不一致的,但这是可以解释的 编辑:事实上,
identity
是一个内置对象(identity函数),我没有意识到这一点(因此问题实际上是可以重现的)
identity
是一个类--function
--的对象,该类有一个plot
方法(plot.function
)和一个add
参数,而默认的plot
方法不具有add
参数
一般来说,在尝试打印对象
条形图时,应尝试类(条形图)
;如果它属于类foo
,则尝试methods(class=“foo”)
查看它是否有绘图方法,或者尝试methods(“plot”)
查看是否存在plot.foo
。尝试?plot.foo
查看帮助,或plot.foo
或getAnywhere(plot.foo)
查看函数本身。这是因为当您调用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)
来避免这种不一致性,但是您需要确保不添加新的轴标签或重新绘制轴编辑:正如注释中指出的,您必须确保范围与上一个绘图相同。e、 g:
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
能否请您告诉我们对象的类别标识?PS。请注意,使用T
作为TRUE
的快捷方式可能会给您带来麻烦。由于TRUE
是保留字,因此它将始终是TRUE
。但是您可以从包库中重新定义T identity()是一个标准函数(请参见?identity)。感谢Andrie对T和TRUE的评论!谢谢你,本!现在清楚了!!是的,plot.function将我重定向到curve(),这就解释了这一点。但是方法(“plot”)既不显示plot.function,也不显示曲线。另外,这些方法(class=“function”)没有给出任何关于plot方法的答案……你是对的,它们不起作用。不过,我认为他们应该这样做。我已经向r开发者列表发送了一个查询。@托马斯:这可能会让你感到安慰,也可能不会,但他们现在在r的“开发”版本中工作。这是最近的一个变化……你应该问一个新问题。我的评论不是关于add
,而是关于methods(“plot”)
和methods(class=“function”)
(它们确实有效)。明白了:plot(acf(x,plot=FALSE))
notplot(acf(x))
也谢谢nullglob的解释!现在清楚了。但是你的例子不是很清楚:-)它不起作用,因为比例不同,所以A字母绘制在错误的位置:-)这是低级技巧,我想不应该使用,但是谢谢-也许有一天我会使用它:-)你是对的-我忘了保留范围。这是使用par(new=TRUE)
时需要注意的事项。现在我在示例中修复了它。它不是(直接)调用的plot.xy(),而是plot.default(),plot()的S3默认方法。{plot.xy()不是用户通常应该使用的东西,而且它也不是plot()方法,尽管它的名称可能暗示了这一点……它的名称主要来自s的非常古老的历史,s是R}的前身