Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R不一致性:为什么add=T有时在plot()函数中起作用,有时不起作用?_R_Plot_Add - Fatal编程技术网

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

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") 它不起作用!!它说“添加”不是一

为什么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")
它不起作用!!它说“添加”不是一个图形参数

请不要写我应该使用
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))
not
plot(acf(x))
也谢谢nullglob的解释!现在清楚了。但是你的例子不是很清楚:-)它不起作用,因为比例不同,所以A字母绘制在错误的位置:-)这是低级技巧,我想不应该使用,但是谢谢-也许有一天我会使用它:-)你是对的-我忘了保留范围。这是使用
par(new=TRUE)
时需要注意的事项。现在我在示例中修复了它。它不是(直接)调用的plot.xy(),而是plot.default(),plot()的S3默认方法。{plot.xy()不是用户通常应该使用的东西,而且它也不是plot()方法,尽管它的名称可能暗示了这一点……它的名称主要来自s的非常古老的历史,s是R}的前身