Nel corpo di alcune funzioni R, ad esempio lm
, vedo le chiamate alla funzione match.call
. Come dice la pagina di aiuto, se utilizzato all'interno di una funzione, match.call
restituisce una chiamata in cui vengono specificati i nomi degli argomenti; e questo dovrebbe essere utile per passare un gran numero di argomenti a un'altra funzione.Perché match.call è utile?
Per esempio, nella funzione lm
vediamo una chiamata alla funzione 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())
Perché questo è più utile di effettuare una chiamata direttamente al model.frame
specificando i nomi degli argomenti, come devo fare?
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)
Nota che match.call
ha un altro uso che io non discuto, conservare la chiamata in oggetto risultante.
Per uno, non hai scritto tutto questo. Puoi fare cose come passare tutti gli argomenti contemporaneamente, qualcosa come 'f <- function (x, y, z) do.call (" sum ", as.list (match.call() [- 1])); f (1, 2, 3) ## [1] 6'. Ovviamente questo sarebbe molto più utile per una lunga lista di argomenti nominati –
Abbastanza giusti, immagino che si possa anche fare l'affettamento dell'argomento inverso. 'f <- function (x, y, z) {l <- as.list (match.call()) [- 1]; do.call (sum, l [setdiff (names (l), 'z') ])} '. Ad ogni modo, credo di essere stato confuso riguardo l'uso in 'lm'. Tuttavia trovo che tutto sia risolvibile con l'argomento '...' abbastanza facilmente. Credo di essere pignolo. – Usobi
@Usobi: 'match.call()' è più robusto nel senso seguente? Se usi '...' allora non sai quali argomenti vengono passati e potresti finire con le cose passate che non vuoi o che rompono le cose in modi inaspettati. D'altra parte, se si ripetono esplicitamente i nomi degli argomenti per passarli, questo renderà il codice più difficile da refactificare se si cambiano le definizioni degli argomenti della funzione. – peterthinking