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 <- FALSE
或T <- 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.foo
或getAnywhere(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()
。 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
正如 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() 函数中无效?的主要内容,如果未能解决你的问题,请参考以下文章
为啥有时 IEnumerable<T> 中的元素是可变的,而有时它们是不可变的? [复制]
为啥打印 unsigned char 有时有效,有时无效?在 C 中