कुछ आर कार्यों के शरीर में, उदाहरण के लिए lm
मैं match.call
फ़ंक्शन पर कॉल देखता हूं। चूंकि यह सहायता पृष्ठ कहता है, जब किसी फ़ंक्शन 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
एक और उपयोग है कि मैं, पर चर्चा जिसके परिणामस्वरूप वस्तु में कॉल स्टोर नहीं करते है।
एक के लिए, आपने यह सब कुछ नहीं लिखा है। आप एक ही समय में सभी तर्कों को पारित करने जैसी चीजें कर सकते हैं, जैसे कि 'f <- function (x, y, z) do.call ("sum", as.list (match.call() [- 1])); एफ (1, 2, 3) ## [1] 6'। जाहिर है यह नामित तर्कों की एक लंबी सूची के लिए अधिक उपयोगी होगा –
पर्याप्त मेला, मुझे लगता है कि आप रिवर्स तर्क स्लाइसिंग भी कर सकते हैं। 'एफ <- फ़ंक्शन (एक्स, वाई, जेड) {एल <- as.list (match.call()) [- 1]; do.call (sum, l [setdiff (नाम (एल), 'z') ])} '। वैसे भी, मुझे लगता है कि मैं 'एलएम' में उपयोग के बारे में उलझन में था। हालांकि मुझे लगता है कि सबकुछ आसानी से '...' तर्क के साथ सुलभ है। मुझे लगता है मुझे पक्की मिल रही है। – Usobi
@Usobi: क्या 'match.call() 'निम्नलिखित अर्थ में अधिक मजबूत है? यदि आप '...' का उपयोग करते हैं तो आप नहीं जानते कि कौन से तर्क पारित किए जाते हैं, और आप उन चीज़ों के साथ समाप्त हो सकते हैं जिन्हें आप नहीं चाहते थे या जो अप्रत्याशित तरीकों से चीजों को तोड़ते हैं। दूसरी तरफ, यदि आप उन्हें पास करने के लिए तर्क नामों को स्पष्ट रूप से दोहराते हैं, तो यदि आप फ़ंक्शन तर्क परिभाषाओं को बदलते हैं तो यह कोड को रिफैक्टर करने के लिए कठिन बना देगा। – peterthinking