gpt4 book ai didi

r - 为什么 match.call 有用?

转载 作者:行者123 更新时间:2023-12-01 17:40:36 31 4
gpt4 key购买 nike

在一些 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())
...

...为什么这比直接调用 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 还有一个我不讨论的用途,即将调用存储在结果对象中。)

最佳答案

与此相关的一个原因是 match.call 捕获调用的语言而不对其进行评估,在这种情况下,它允许 lm 处理某些“缺少”变量作为“可选”。考虑:

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

对比:

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)'

lm2中,由于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 根本不涉及缺少的参数。

您可能会争辩说,可选参数应该通过默认值显式设置为可选,但这不是这里发生的情况。

关于r - 为什么 match.call 有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32486753/

31 4 0