plot()
と の両方を呼び出す関数を作成したいと考えています。ユーザーがいくつかの追加の引数を指定してから、またはlegend()
に渡すことができれば理想的です。を使用して2つの関数のいずれかでこれを達成できることを私は知っています:plot()
legend()
...
foo.plot <- function(x,y,...) {
plot(x,y,...)
legend("bottomleft", "bar", pch=1)
}
foo.plot(1,1, xaxt = "n")
xaxt = "n"
これはプロットに渡されます。しかし、たとえば、関数ヘッダーで引数を事前に指定せずtitle = "legend"
に呼び出しに渡す方法はありますか?legend()
受け入れられた回答からの更新: VitoshKa の方法は、私が望むことを達成するのに最もエレガントだと思いました。ただし、希望どおりに機能するまで、回避しなければならない小さな問題がいくつかありました。
最初に、どのパラメーターに渡しlegend
、どのパラメーターに渡すかを確認しましたplot
。この目的のための最初のステップは、どの引数がplot および/または par にlegend
固有で、一部ではないかを確認することでした。legend
legend.args <- names(formals(legend))
plot.args <- c(names(formals(plot.default)), names(par()))
dput(legend.args[!(legend.args %in% plot.args)])
私がdput()
ここで使用するのは、行plot.args <- c(names(formals(plot.default)), names(par()))
が常に私が望まない新しい空のプロットを呼び出すためです。dput
そのため、次の関数での出力を使用しました。
次に、重複する引数に対処する必要がありました ( 経由で取得しますdput(largs.all[(largs.all %in% pargs.all)])
)。いくつかの場合、これは些細なことでした (例: )。他x
のy
ものは両方の関数に渡されます (例: pch
)。しかし、私の実際のアプリケーションでは、他の戦略も使用しています (たとえば、 の変数名は異なりますadj
が、この例では実装されていません)。
最後に、do.call
関数を 2 つの方法で変更する必要がありました。まず、what の部分 (つまり、関数と呼ばれる部分) は文字にする必要があります (つまり、 の'plot'
代わりにplot
)。また、引数リストは少し異なる方法で作成する必要があります。
foo.plot <- function(x,y,...) {
leg.args.unique <- c("legend", "fill", "border", "angle", "density", "box.lwd", "box.lty", "box.col", "pt.bg", "pt.cex", "pt.lwd", "xjust", "yjust", "x.intersp", "y.intersp", "text.width", "text.col", "merge", "trace", "plot", "ncol", "horiz", "title", "inset", "title.col", "title.adj")
leg.args.all <- c(leg.args.unique, "col", "lty", "lwd", "pch", "bty", "bg", "cex", "adj", "xpd")
dots <- list(...)
do.call('plot', c(list(x = x, y = x), dots[!(names(dots) %in% leg.args.unique)]))
do.call('legend', c(list("bottomleft", "bar"), dots[names(dots) %in% leg.args.all]))
}
foo.plot(1,1,pch = 4, title = "legendary", ylim = c(0, 5))
この例でpch
は、 は と の両方plot
に渡されlegend
、はとのみにtitle
渡されます。legend
ylim
plot
Gavin Simpson のコメントに基づく更新 2 (Vitoshka の回答のコメントも参照):
(i) その通りです。
(ii) いつでも文字にできます。ただし、関数と同じ名前の変数がある場合は、関数名を で引用する必要がありますdo.call
。
min.plot <- function(x,y,plot=TRUE) if(plot == TRUE) do.call(plot, list(x = x, y = y))
min.plot(1,1)
Error in do.call(plot, list(x = x, y = y)) :
'what' must be a character string or a function
(iii) 使用できc(x = 1, y = 1, list())
、正常に動作します。しかし、私が実際に行ったこと (私が与えた例ではなく、私の実際の関数) は次のとおりです:これを
次とc(x = 1, y = 1, xlim = c(0, 2), list(bla='foo'))
比較してください:リストには(長さ 2 のベクトルで、私が欲しかったものです) しかありません。c(list(x = 1, y = 1, xlim = c(0, 2)), list(bla='foo'))
xlim
xlim1
xlim2
xlim
したがって、あなたは私の例についてすべての点で正しいです。しかし、私の実際の関数 (より多くの変数を使用) では、これらの問題に遭遇したため、ここで文書化したいと思いました。不正確で申し訳ありません。