आर

2010-08-10 12 views
7

में फ़ंक्शन नामों की सुरक्षा करना फ़ंक्शन नामों (या सामान्य रूप से चर) की रक्षा के लिए आर में संभव है ताकि उन्हें मुखौटा नहीं किया जा सके।आर

मैंने हाल ही में देखा है कि यह "नई" नाम के साथ डेटा फ्रेम बनाते समय एक समस्या हो सकती है, जिसने लामर द्वारा उपयोग किए गए फ़ंक्शन को मुखौटा किया और इस प्रकार इसे काम करना बंद कर दिया। (रिकवरी आसान है जब आप जानते हैं कि समस्या क्या है, यहां "आरएम (नया)" ने किया।)

+0

एक डेटा फ्रेम एक समारोह अधिलेखित नहीं कर सकते हैं। आप एक ही समय में दोनों का उपयोग कर सकते हैं। – James

+0

"ओवरराइट" गलत शब्द था। मुखौटा? – AndyF

+1

http://stackoverflow.com/questions/936748/declaring-a-const-variable-in-r – hadley

उत्तर

4

शायद वातावरण का उपयोग करें! नामस्थानों को अलग करने का यह एक शानदार तरीका है। उदाहरण के लिए:

> a <- new.env() 
> assign('printer', function(x) print(x), envir=a) 
> get('printer', envir=a)('test!') 
[1] "test!" 
+2

का डुप्लिकेट बेशक, कोई 'ए' ओवरराइट कर सकता है :) – geoffjentry

2

@hdallazuanna (via Twitter)

new <- 1 
lockBinding('new', globalenv()) 

इस समझ में आता है जब चर उपयोगकर्ता बनाया है, लेकिन नहीं, ज़ाहिर है, एक पैकेज से एक समारोह अधिलेखित रोकने करता सिफारिश की।

6

परिवर्तनीय नामों की सुरक्षा के बारे में चिंता किए बिना आपकी समस्या के लिए एक आसान कामकाज है (हालांकि lockBinding के साथ खेलना मजेदार दिखता है)। यदि कोई फ़ंक्शन मुखौटा हो जाता है, जैसा कि आपके उदाहरण में है, तो :: ऑपरेटर की सहायता से मास्क किए गए संस्करण को कॉल करना अभी भी संभव है।

सामान्यतः, वाक्यविन्यास packagename::variablename है।

(समारोह आप चाहते हैं पैकेज से निर्यात नहीं किया गया है, तो आप तीन कोलन बजाय, :::। यह इस मामले में हालांकि लागू नहीं करना चाहिए की जरूरत है।)

+0

अगर मैं कोई फ़ंक्शन कॉल कर रहा हूं तो काम नहीं करता , एक पैकेज में, जो किसी अन्य कार्य पर निर्भर करता है जो अनजाने में मुखौटा बन गया है। – AndyF

+0

@ एंडीएफ हाँ यह एक अच्छा मुद्दा है। मैं जवाब में एक विषय देख रहा हूं: आर उपयोगकर्ताओं को खुद से सुरक्षित नहीं करता है। यह बहुत लिनक्स की तरह है। ;) –