2015-09-09 12 views
14

कुछ आर कार्यों के शरीर में, उदाहरण के लिए 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 एक और उपयोग है कि मैं, पर चर्चा जिसके परिणामस्वरूप वस्तु में कॉल स्टोर नहीं करते है।

+6

एक के लिए, आपने यह सब कुछ नहीं लिखा है। आप एक ही समय में सभी तर्कों को पारित करने जैसी चीजें कर सकते हैं, जैसे कि 'f <- function (x, y, z) do.call ("sum", as.list (match.call() [- 1])); एफ (1, 2, 3) ## [1] 6'। जाहिर है यह नामित तर्कों की एक लंबी सूची के लिए अधिक उपयोगी होगा –

+0

पर्याप्त मेला, मुझे लगता है कि आप रिवर्स तर्क स्लाइसिंग भी कर सकते हैं। 'एफ <- फ़ंक्शन (एक्स, वाई, जेड) {एल <- as.list (match.call()) [- 1]; do.call (sum, l [setdiff (नाम (एल), 'z') ])} '। वैसे भी, मुझे लगता है कि मैं 'एलएम' में उपयोग के बारे में उलझन में था। हालांकि मुझे लगता है कि सबकुछ आसानी से '...' तर्क के साथ सुलभ है। मुझे लगता है मुझे पक्की मिल रही है। – Usobi

+2

@Usobi: क्या 'match.call() 'निम्नलिखित अर्थ में अधिक मजबूत है? यदि आप '...' का उपयोग करते हैं तो आप नहीं जानते कि कौन से तर्क पारित किए जाते हैं, और आप उन चीज़ों के साथ समाप्त हो सकते हैं जिन्हें आप नहीं चाहते थे या जो अप्रत्याशित तरीकों से चीजों को तोड़ते हैं। दूसरी तरफ, यदि आप उन्हें पास करने के लिए तर्क नामों को स्पष्ट रूप से दोहराते हैं, तो यदि आप फ़ंक्शन तर्क परिभाषाओं को बदलते हैं तो यह कोड को रिफैक्टर करने के लिए कठिन बना देगा। – peterthinking

उत्तर

7

एक कारण यह है कि यहां प्रासंगिक है कि 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 में इसका इस्तेमाल करते हैं, आर 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))) 

match.call सब पर लापता तर्क शामिल नहीं है।

आप तर्क दे सकते हैं कि वैकल्पिक तर्क डिफ़ॉल्ट मानों के माध्यम से स्पष्ट रूप से वैकल्पिक किए गए थे, लेकिन ऐसा नहीं हुआ कि यहां क्या हुआ।

संबंधित मुद्दे