R 不一致:为啥 add=T 有时有效,有时在 plot() 函数中无效?

Posted

技术标签:

【中文标题】R 不一致:为啥 add=T 有时有效,有时在 plot() 函数中无效?【英文标题】:R inconsistency: why add=T sometimes works and sometimes not in the plot() function?R 不一致:为什么 add=T 有时有效,有时在 plot() 函数中无效? 【发布时间】:2011-10-10 23:16:28 【问题描述】:

为什么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吗? 附言。请注意,使用T 作为TRUE 的快捷方式可能会给您带来麻烦。因为TRUE 是保留字,所以它总是TRUE。但是您可以重新定义T <- FALSET <- 0,这可能会导致各种意外行为。 identity() 是来自包库的标准函数(参见 ?identity)。感谢 Andrie 对 T 和 TRUE 的评论! 【参考方案1】:

这确实令人讨厌且前后矛盾,但这是可以解释的。

编辑identity 是一个内置对象(身份函数)这一事实让我无法理解(因此问题实际上是可重现的)。

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

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

【讨论】:

谢谢本!现在很清楚了!!是的, ?plot.function 将我重定向到 curve() 并解释了它。但是 methods("plot") 既不显示 plot.function 也不显示曲线。另外,methods(class="function") 没有给出任何关于绘图方法的答案... 你说得对,它们不起作用。不过,我认为他们应该这样做。我已向 r 开发人员列表发送查询。 @Tomas:这对你来说可能是也可能不是,但它们现在可以在 R 的“开发”版本中工作。这是最近的变化...... 你应该问一个新问题。我的评论不是关于add,而是关于methods("plot")methods(class="function") 的使用(确实有效)。 一个陷阱:plot( acf( x, plot=FALSE )) 不是plot( acf(x) )【参考方案2】:

这是因为当您调用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 时列出/p>

【讨论】:

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

以上是关于R 不一致:为啥 add=T 有时有效,有时在 plot() 函数中无效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 == 比较两个整数有时有效,有时无效? [复制]

为啥指向未定义结构的指针有时在 C 和 C++ 中是非法的

为啥有时 IEnumerable<T> 中的元素是可变的,而有时它们是不可变的? [复制]

为啥打印 unsigned char 有时有效,有时无效?在 C 中

为啥 UISearchDisplayController 有时有效,有时无效?

为啥 if != nil 有时仅在使用应用程序期间有效?