为什么match.call有用?

Uso*_*obi 19 r call

在一些R函数的主体中,例如lm我看到对match.call函数的调用.正如帮助页面所说,在函数内部使用时会match.call返回一个调用,其中指定了参数名称; 这对于将大量参数传递给另一个函数应该是有用的.

例如,在lm函数中我们看到对函数的调用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, ...) 
{
  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())
  ...
Run Code Online (Sandbox Code Playgroud)

为什么这比直接调用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)
  ...
Run Code Online (Sandbox Code Playgroud)

请注意,match.call我没有讨论另一个用途,将调用存储在结果对象中.

Bro*_*ieG 8

与此相关的一个原因是,match.call在不对其进行评估的情况下捕获调用的语言,并且在这种情况下,它允许lm将一些"缺失"变量视为"可选".考虑:

lm(x ~ y, data.frame(x=1:10, y=runif(10)))
Run Code Online (Sandbox Code Playgroud)

VS:

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)'
Run Code Online (Sandbox Code Playgroud)

lm2,因为weights"缺失",但你仍然使用它weights=weights,R尝试使用stats::weights明显不是预期的功能.你可以通过在打电话之前测试缺失来解决这个问题model.frame,但在那时match.call开始看起来很不错.看看如果我们debug打电话会发生什么:

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)))
Run Code Online (Sandbox Code Playgroud)

match.call 根本不涉及缺失的论点.

您可以争辩说,可选参数应该通过默认值显式选择,但这不是这里发生的事情.