2015-09-09 4 views
14

一部のR関数の本体では、たとえばlmのように、match.call関数の呼び出しを参照してください。ヘルプページにあるように、関数内で使用すると、match.callは引数名が指定された呼び出しを返します。これは多数の引数を別の関数に渡すのに便利であると考えられます。例えば、lm機能では、我々は、私は次に何として関数の呼び出しmodel.framematch.callはなぜ有用なのですか?

function (formula, data, subset, weights, na.action, method = "qr", 
model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
contrasts = NULL, offset, ...) 
{ 
cl <- match.call() 
mf <- match.call(expand.dots = FALSE) 
m <- match(c("formula", "data", "subset", "weights", "na.action", 
    "offset"), names(mf), 0L) 
mf <- mf[c(1L, m)] 

mf$drop.unused.levels <- TRUE 
mf[[1L]] <- quote(stats::model.frame) 
mf <- eval(mf, parent.frame()) 

はなぜ引数名を指定するmodel.frameに直接電話をかけるよりも、この方が便利です

を参照してください?

function (formula, data, subset, weights, na.action, method = "qr", 
model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
contrasts = NULL, offset, ...) 
{ 
mf <- model.frame(formula = formula, data = data, 
        subset = subset, weights = weights, subset = subset) 

match.callが、私は結果のオブジェクトにコールを保存し、議論していない別の用途があることに注意してください。

+6

1つでは、すべてを書き出す必要はありません。 'f

+0

十分に公正で、私は逆引き引き抜きを行うこともできますね。 do.call(sum、l [setdiff(names(l)、 'z'){f - function(x、y、z){l < - as.list(match.call())[ - 1] ])} '。とにかく、私は 'lm'での使用について混乱していたと思います。しかし、私はすべてが '...'引数で解くことができます。私は嫌な気持ちになると思う。 – Usobi

+2

@Usobi: 'match.call()'は次のような意味でより強固ですか? '...'を使うと、どんな引数が渡されるのかわからないので、あなたが望んでいない、あるいは予期せぬことで物事が壊れてしまうことがあるかもしれません。一方、引数名を明示的に繰り返して渡すと、関数の引数定義を変更すると、コードがリファクタリングされにくくなります。 – peterthinking

答えて

7

match.callは、評価なしで通話の言語をキャプチャします。この場合、lmでは「欠落」変数の一部を「オプション」として扱うことができます。考えてみましょう:

lm(x ~ y, data.frame(x=1:10, y=runif(10))) 

対:lm2

lm2 <- function (
    formula, data, subset, weights, na.action, method = "qr", 
    model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
    contrasts = NULL, offset, ... 
) { 
    mf <- model.frame(
    formula = formula, data = data, subset = subset, weights = weights 
) 
} 
lm2(x ~ y, data.frame(x=1:10, y=runif(10))) 
## Error in model.frame.default(formula = formula, data = data, subset = subset, : 
## invalid type (closure) for variable '(weights)' 

weightsは「行方不明」されていますが、まだweights=weightsでそれを使用するので、Rは、意図されたものを明確ではありませんstats::weights機能を使用しようとします。あなたはmodel.frameに電話する前に欠落をテストすることでこの問題を回避することができますが、その時点でmatch.callがきれいに見えるようになります。

debug(lm2) 
lm2(x ~ y, data.frame(x=1:10, y=runif(10))) 
## debugging in: lm2(x ~ y, data.frame(x = 1:10, y = runif(10))) 
## debug at #5: { 
##  mf <- model.frame(formula = formula, data = data, subset = subset, 
##   weights = weights) 
## } 
Browse[2]> match.call() 
## lm2(formula = x ~ y, data = data.frame(x = 1:10, y = runif(10))) 

match.callまったく欠落している引数を必要としない:私たちはコールをdebugとどうなるかを見てください。

オプションの引数は、デフォルト値で明示的にオプションにする必要がありますが、ここではそうではありません。

関連する問題