web-dev-qa-db-ja.com

Rの不整合:なぜadd = Tが機能し、plot()関数で機能しないのですか?

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の奇妙な動作を理解したいのですが、なぜ動作するのか、動作しないのですか?

48
TMS

これは確かに迷惑で一貫性がありませんが、それは明白です。

編集identityが組み込みオブジェクト(識別関数)であるという事実から逃れました(そのため、問題は実際に再現可能です)。

identityはクラスのオブジェクトです-function-plotメソッド(_plot.function_)にadd引数を指定しますが、デフォルトのplotメソッドはnotadd引数があります。

一般に、オブジェクトbarをプロットする場合は、class(bar)を試してください。クラスfooの場合は、methods(class="foo")を試してplotメソッドがあることを確認するか、methods("plot")を試して_plot.foo_が存在することを確認します。ヘルプを表示するには_?plot.foo_を、関数自体を表示するには_plot.foo_またはgetAnywhere(plot.foo)を試してください。

36
Ben Bolker

これは、plot(0:10, 0:10*3)またはplot(c(2, 3, 4), c(20,10,15))を呼び出すと、間接的にplot.default()が呼び出され、次にplot.xy()が呼び出されるため、他の2つはあなたが言及する呼び出しは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_

27
nullglob