でこれを行うにはどうすればよいですかR
:
私はいくつかの名前の関数を調達しましたexampleFoo
:
exampleFoo <- function(a, predefined, signature)
文字ベクトルが与えられた場合、exampleFoo
それを使用してその名前で関数を呼び出すにはどうすればよいですか?
でこれを行うにはどうすればよいですかR
:
私はいくつかの名前の関数を調達しましたexampleFoo
:
exampleFoo <- function(a, predefined, signature)
文字ベクトルが与えられた場合、exampleFoo
それを使用してその名前で関数を呼び出すにはどうすればよいですか?
これが別の関数内で行われているか、最上位で行われているかによって異なります。それらを逆の順序で取り上げます。
exampleFoo <- function(a, predefined, signature) {
1:10
}
FUN <- "exampleFoo"
get(FUN)
get(FUN)()
> get(FUN)
function(a, predefined, signature) {
1:10
}
> get(FUN)()
[1] 1 2 3 4 5 6 7 8 9 10
関数では、match.fun
ここで引数が最も適切です。get
指定された名前のオブジェクトを検索しmatch.fun
ますが、検索時には関数オブジェクトのみを考慮します。これには、同じ名前を持つ可能性のある非関数オブジェクトが一致しないという追加の利点があります。
FOO <- function(f) {
BAR <- match.fun(f)
BAR()
}
> FOO(FUN)
[1] 1 2 3 4 5 6 7 8 9 10
> FOO("exampleFoo")
[1] 1 2 3 4 5 6 7 8 9 10
match.fun
呼び出し元の親フレームでマッチングを実行するように設計されており、グローバル環境には親 (IIRC) がないため、最上位で (簡単に?)使用することはできません。
@agstudy は、switch
いくつかの定義済み関数の 1 つを名前で呼び出すことができるラッパー関数を持つためのベース アプローチを提案しています。そこでのコメントで、私は 2 つのより単純な代替案を提案しました。ここで私はそれを拡張します:
foo1 <- function(method, ...) {
dots <- list(...)
FUN <- match.fun(method)
do.call(FUN, dots)
}
また
foo2 <- function(method = c("fun1", "fun2", "fun3"), ...) {
dots <- list(...)
method <- match.arg(method)
FUN <- match.fun(method)
do.call(FUN, dots)
}
これらは、任意の引数 plus を取るかなり一般的な関数として記述しましたmethod
。関数が引数をmethod
持つために / によって参照される場合、...
これらはおそらく 1 つ以上の名前付き引数を使用して直接呼び出すことができます。
## assuming `method` refers to a function with a first argument `x` and also
## a `...` argument
foo3 <- function(method, x, ...) {
FUN <- match.fun(method)
FUN(x, ...)
}
私はswitch
これに次のようなものを使用します:
algoFactory <- function (method = c("algo1", "alog2",
"algo3")
{
method = method[1]
switch(method, algo1 = {
res = algo1.Impl(...)
}, algo2 = {
res = algo2.Impl(...)
}, algo3 = {
res = algo3.Impl(...)
})}
そして、新しいアルゴリズムを追加するたびに、このメイン関数を更新します。RscripT では、たとえば次のように呼び出します。
Rscript algoFactory.R 'algo1'