9

関数内からすべての関数パラメーターを取得する方法はありますか?

match.call()デフォルトが設定されているがオーバーライドされていないパラメーターを返しません。例えば:

xf <- function (a, b="Hi", c=TRUE) {
  print(as.list(match.call(expand.dots=FALSE)))
}

>xf(3)
[[1]]
xf

$a
[1] 3

既存の関数を呼び出す関数を含むパッケージを作成していますが、既存の関数にないデフォルトを設定できるようにしたいと考えています。( のリストを使用してmatch.call、それを他の関数に渡しdo.call、結果を返すことを計画していました。

更新: S3 メソッドに関連する興味深い問題。新しい S3 メソッドを作成し、@ Ferdinand.kraft の回答を使用しました。as.list(environment(), all.names=TRUE)all.names 引数は、リスト内の a で始まる名前を保持.します。メソッドのディスパッチによって、関数環境にいくつかの引数が追加されることがわかります.Generic .Class .Method。これらを の関数に渡すと、問題が発生する可能性がありますdo.call。他の答えの 1 つは、より優れた万能ソリューションかもしれませんが、私は のシンプルさが気に入っていas.list(environment())ます。

4

2 に答える 2

5

lsとを使用できますmgetlsは (デフォルトで) 呼び出しフレーム (この場合は関数内) 内のオブジェクトをリストし、mgetこれらを取得します。

例えば

xf <- function(a,b='Hi',c){
  # this gets the current definitions of `a`, `b`, and `c` 
  incall <-mget(ls())
  incall}

 xf(3)
## $a
## [1] 3
## 
## $b
## [1] "Hi"
##
## $c

その後、使用できますdo.call(whatever, incall)

于 2013-04-09T00:55:01.643 に答える