2013-04-09 15 views
7

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

match.call()は、デフォルトは設定されていてもオーバーライドされないパラメータは返されません。たとえば:

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

>xf(3) 
[[1]] 
xf 

$a 
[1] 3 

私は、既存の関数を呼び出す関数とパッケージを書いていますが、私は、既存の機能にないデフォルト値を設定できるようにしたいです。 (私はdo.callで他の関数に渡し、その結果を返す、match.callからリストを使用して計画された

更新:S3方法に関する興味深い問題を私は新しいS3メソッドを作成し、使用します@ Ferdinand.kraftの答えas.list(environment(), all.names=TRUE) all.names引数は、.で始まる名前をリスト内に保持します。メソッドディスパッチは、.Generic.Class.Methodなどのいくつかの引数を関数環境に追加します。あなたはdo.callの関数にこれらを渡します。他の答えの1つはソリューションのすべての方が良いかもしれませんが、私はの単純さが好きです。

+0

はありません'argあなたは何をしたいですか? –

答えて

10

を使用することができますまた、関数の先頭に環境を戻すことができます。

​​

結果:

> xf(a=1) 
$a 
[1] 1 

$b 
[1] "Hi" 

$c 
[1] TRUE 
+0

私はシンプルさが好きです。 – Seth

+0

私も。 :-)引数名がドットで始まらない場合や、引数を渡したくない場合は、引数all 'TRUE'を削除することもできます。 –

4

lsmgetを使用できます。 lsは(デフォルトでは)呼び出し元のフレーム内のオブジェクトをリストします(この場合は関数内にあります)。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)

+0

mgetをうまく使用しています。 – Seth