2017-02-08 5 views
2

関数呼び出しの引数を省略し、ii)デフォルト値を知らずに、関数引数のデフォルト値を使用するようにRに指示するにはどうすればよいですか?Rの関数引数のデフォルト値を明示的に呼び出す方法は?

私はrnorm()meanのデフォルト値を使用することができます知っている:

rnorm(n = 100) # by omitting the argument 
# or 
rnorm(n = 100, mean = 0) # by including it in the call with the default value 

しかし、私は、デフォルト値を知っているが、関数呼び出しで明示的に含めたくないと仮定します。それをどうすれば実現できますか?

+0

具体的な理由はありますか? – bsg

答えて

3

あなたは経由して引数リストとデフォルト値にアクセスすることができます。また、作品

> formals(rnorm) 
$n 


$mean 
[1] 0 

$sd 
[1] 1 

formals("rnorm")。いくつかの簡単な例:明らかに

> rnorm(10,mean = formals(rnorm)$mean) 
[1] -0.5376897 0.4372421 0.3449424 -0.9569394 -1.1459726 -0.6109554 0.1907090 0.2991381 -0.2713715 
[10] -1.4462570 
> rnorm(10,mean = formals(rnorm)$mean + 3) 
[1] 2.701544 2.863189 1.709289 2.987687 2.848045 5.136735 2.559616 3.827967 3.079658 5.016970 

は、あなたにも、時間のformals(rnorm)先の結果を格納することができます。

0

@joranがすでに指摘しているように、formals()はデフォルト値を公開しています。しかし、私が質問を理解しているように、実際には呼び出し式の構築が後になります。そのためには、formals()as.call()を組み合わせて呼び出し自体を生成すると便利です。

drop_missing <- function(sig) { 
    sig[!sapply(sig, identical, quote(expr =))] 
} 

complete_call <- function(f) { 
    nm <- as.name(f) 
    sig <- formals(args(f)) 
    make_call <- function() { 
    args <- match.call()[-1] 
    sig[names(args)] <- args 
    as.call(c(nm, drop_missing(sig))) 
    } 
    formals(make_call) <- sig 
    make_call 
} 

使用例:

complete_call("log")(1) 
#> log(x = 1, base = exp(1)) 

complete_call("rnorm")(10) 
#> rnorm(n = 10, mean = 0, sd = 1) 

complete_call("rnorm")() 
#> rnorm(mean = 0, sd = 1) 

備考:

次の関数は、指定された関数名fのために「引数完了呼び出しを」生産機能を生成することによってちょうどそれを、ありません1)出力は言語オブジェクトです。呼び出しを実行するには、あなたはむしろ関数の名前よりも、機能を受け入れるようにcomplete_call()をしたい場合は、あなたが与えられた割り当ての代わりにnm <- as.name(deparse(substitute(f)))を書くことができ

eval(complete_call("rnorm")(10)) 
#> [1] -0.89428324 -1.78405483 -1.83972728 ... (output truncated) 

2)、例えば、それを評価する必要があります。しかし、これはネストされた呼び出しでは機能しません。の場合はas.name("f")が得られます。これは、Rのレキシカルスコープの規則のためです。

3)args()への呼び出しがsigに割り当てられていない場合、complete_call()は、プリミティブ関数と組み込み関数には定型がないため、クロージャーにのみ機能します。

関連する問題