0

でこれを行うにはどうすればよいですかR

私はいくつかの名前の関数を調達しましたexampleFoo

exampleFoo <- function(a, predefined, signature)

文字ベクトルが与えられた場合、exampleFooそれを使用してその名前で関数を呼び出すにはどうすればよいですか?

4

3 に答える 3

4

これが別の関数内で行われているか、最上位で行われているかによって異なります。それらを逆の順序で取り上げます。

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, ...)
}
于 2013-04-05T15:19:05.643 に答える
1

私は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'
于 2013-04-05T14:55:17.503 に答える