@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()
は、プリミティブ関数と組み込み関数には定型がないため、クロージャーにのみ機能します。
具体的な理由はありますか? – bsg