2012-02-22 11 views
6

निम्नलिखित आर कोड पर विचार करें:आर: अस्थायी रूप से अधिभावी कार्यों और गुंजाइश/नाम स्थान

local({ 
    lm <- function(x) x^2 
    lm(10) 
}) 

यह अस्थायी रूप से lm समारोह को ओवरराइड करता है, लेकिन एक बार local निष्पादित कर दिया गया है यह "वापस सामान्य हो" होगा। मैं सोच रहा हूँ क्यों एक ही दृष्टिकोण यह अगले ही सरल उदाहरण में काम करने के लिए प्रतीत नहीं होता:

require(car) 
model <- lm(len ~ dose, data=ToothGrowth) 
local({ 
    vcov <- function(x) hccm(x) #robust var-cov matrix 
    confint(model) # confint will call vcov, but not the above one. 
}) 

confint समारोह गुणांक के लिए मानक त्रुटियों प्राप्त करने के लिए vcov फ़ंक्शन का उपयोग करता है, और विचार एक मजबूत var- उपयोग करने के लिए है सीओवी मैट्रिक्स vcov अस्थायी रूप से ओवरराइड करके, "मैन्युअल" या कार्यों को बदलने के बिना।

दोनों vcov और confint सामान्य कार्य हैं, यदि इस कारण के रूप में इरादा यह काम नहीं करता है मैं नहीं जानता। यह एक विशिष्ट उदाहरण नहीं है जिसमें मुझे रूचि है; बल्कि वैचारिक सबक। क्या यह एक नामस्थान या दायरा "मुद्दा" है?

उत्तर

4

हम कैसे इस प्रॉक्सी वस्तुओं का उपयोग कर (इस document की प्रॉक्सी अनुभाग देखें) करने के लिए, पहले proto package और उसके बाद बिना उपयोग करते हुए दिखाई देते हैं:

1) आद्य। चूंकि confint.lmvcov बुला रहा है हमें यह सुनिश्चित करना है कि (क) vcov के लिए हमारे नए प्रतिस्थापन संशोधित confint.lm के पर्यावरण और (ख) संशोधित confint.lm अभी भी अपने मूल से वस्तुओं का उपयोग कर सकते में है की जरूरत है। (उदाहरण के लिए, confint.lm आँकड़े में छिपा समारोह format.perc कॉल इसलिए यदि हम दूसरी बात के लिए व्यवस्था नहीं की थी सच है कि छिपे हुए समारोह पहुँचा नहीं जा सका।)

ऊपर करने के लिए हम एक नए confint.lm जो है एक ही छोड़कर यह जो हमारे प्रतिस्थापन vcov शामिल एक नए वातावरण (प्रॉक्सी वातावरण) है और बदले में जिसकी मूल मूल confint.lm माहौल है। नीचे, प्रॉक्सी पर्यावरण को प्रोटो ऑब्जेक्ट के रूप में कार्यान्वित किया जाता है जहां मुख्य आइटम यहां जानना है: (ए) प्रोटो ऑब्जेक्ट्स वातावरण हैं और (बी) एक प्रोटो ऑब्जेक्ट में फ़ंक्शन डालने के तरीके से दिखाया गया है कि प्रोटोटा ऑब्जेक्ट होने के लिए इसका वातावरण बदलता है । इसके अलावा confintconfint.lm के हम confint.lm विधि सीधे कॉल S3 प्रेषण से किसी भी समस्याओं से बचने के लिए। एक और उदाहरण के लिए

library(car) 
library(proto) 

trace(hccm) 

model <- lm(len ~ dose, data=ToothGrowth) 
proto(environment(stats:::confint.lm), # set parent 
    vcov = function(x) hccm(x), #robust var-cov matrix 
    confint.lm = stats:::confint.lm)[["confint.lm"]](model) 

, उदाहरण के 2 here देखें:

हालांकि hccm हम है कि यह trace के उत्पादन में देख द्वारा चलाया गया था सत्यापित कर सकते हैं यहाँ किसी भी अलग परिणाम है लगता नहीं है।

2) वातावरण।कोड में थोड़ा और अधिक आद्य बिना महती है (वास्तव में यह मोटे तौर पर कोड आकार दोगुना हो जाता है), लेकिन यहाँ यह है:

library(car) 

trace(hccm) 

model <- lm(len ~ dose, data=ToothGrowth) 
local({ 
    vcov <- function(x) hccm(x) #robust var-cov matrix 
    confint.lm <- stats:::confint.lm 
    environment(confint.lm) <- environment() 
    confint.lm(model) # confint will call vcov, but not the above one. 
}, envir = new.env(parent = environment(stats:::confint.lm))) 

संपादित करें: स्पष्टता में विभिन्न सुधारों

+0

शानदार है, मैं प्रोटो पैकेज से परिचित नहीं था लेकिन यह अपेक्षाकृत उपयोगी लगता है। मैं विगनेट पढ़ने के लिए चला गया, और यह एक अच्छा पढ़ा है। प्रयास करने के लिए धन्यवाद! – Stefan

2

ऐसा इसलिए है क्योंकि confint और vcov कार्यस्थान "आंकड़े" दोनों में हैं। जिस कन्फिंट() को आप यहां कॉल करते हैं, वह प्रभावी रूप से आंकड़े :: vcov प्राप्त करता है, बहुत अधिक है क्योंकि नामस्थान आपके लिए हैं - आपको चीजों के अपने संस्करण लिखने की अनुमति है, लेकिन अन्यथा अपेक्षित व्यवहार के नुकसान के लिए नहीं।

अपने पहले उदाहरण में, आप अभी भी सुरक्षित रूप से अन्य कार्यों है कि आँकड़े :: एल एम पर भरोसा करते हैं कॉल कर सकते हैं और है कि अपने स्थानीय संशोधन से परेशान नहीं मिलेगा।

+0

ठीक है, तो सिवाय वर्ग के लिए (मॉडल) <- सी ("एलएमआर", कक्षा (मॉडल)); vcov.lmr <- फ़ंक्शन (x) hccm (x); confint (मॉडल); वांछित फ़ंक्शन को इंगित करने के लिए कोई चाल नहीं है? (इनलाइन टिप्पणी के लिए खेद है) – Stefan

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