2009-08-21 17 views
26

कई परिचय आर पुस्तकें और गाइड data.frame को जोड़ने के अभ्यास से शुरू होते हैं ताकि आप चर से वेरिएबल को कॉल कर सकें। मैंने हमेशा $ नोटेशन या स्क्वायर ब्रैकेट स्लाइसिंग [,2] के साथ कॉल चर के लिए अनुकूल पाया है। इस तरह मैं उन्हें भ्रमित किए बिना एकाधिक data.frame एस का उपयोग कर सकता हूं और/या ब्याज के कॉलम को लगातार कॉल करने के लिए पुनरावृत्ति का उपयोग कर सकता हूं। यहक्या आप नाम या टुकड़ा करके संलग्न() या कॉल चर का उपयोग करते हैं?

लोग इस अभ्यास के बारे में कैसा महसूस करते हैं प्रयोग से बचें: मैं गूगल ने हाल ही तैनात coding guidelines for R जो लाइन

1) संलग्न शामिल देखा?

उत्तर

25

मैं कभी भी संलग्नक का उपयोग नहीं करता हूं। with और within आपके दोस्त हैं।

उदाहरण कोड:

> N <- 3 
> df <- data.frame(x1=rnorm(N),x2=runif(N)) 
> df$y <- with(df,{ 
    x1+x2 
}) 
> df 
      x1   x2   y 
1 -0.8943125 0.24298534 -0.6513271 
2 -0.9384312 0.01460008 -0.9238312 
3 -0.7159518 0.34618060 -0.3697712 
> 
> df <- within(df,{ 
    x1.sq <- x1^2 
    x2.sq <- x2^2 
    y <- x1.sq+x2.sq 
    x1 <- x2 <- NULL 
}) 
> df 
      y  x2.sq  x1.sq 
1 0.8588367 0.0590418774 0.7997948 
2 0.8808663 0.0002131623 0.8806532 
3 0.6324280 0.1198410071 0.5125870 

संपादित करें: हैडली का उल्लेख है टिप्पणी में बदलना। यहां कुछ कोड है:

> transform(df, xtot=x1.sq+x2.sq, y=NULL) 
     x2.sq  x1.sq  xtot 
1 0.41557079 0.021393571 0.43696436 
2 0.57716487 0.266325959 0.84349083 
3 0.04935442 0.004226069 0.05358049 
+3

'ट्रांसफॉर्म' भीतर एक और उपयोगी भिन्नता है। – hadley

+1

असल में मैंने अभी देखा है कि 'संलग्न() 'के विपरीत,'() के साथ" कार्यों के माध्यम से "हल नहीं होता है। पहले 'printx <- function {print (x)}' सेट करें। अब, 'के साथ (सूची (x = 42), printx())' के साथ विफल रहता है (सूची (x = 42), प्रिंट (x)) 'और' संलग्न करें (सूची (x = 42)); printx() 'सफल'! :( –

3

मैं attach() का उपयोग नहीं करना पसंद करता, क्योंकि प्रत्येक बार attach() पर कॉल करने के लिए कोड के बैच को चलाने में बहुत आसान होता है। प्रत्येक बार खोज पथ में डेटा फ्रेम जोड़ा जाता है, इसे अनावश्यक रूप से विस्तारित किया जाता है। बेशक, कोड के ब्लॉक के अंत में अच्छी प्रोग्रामिंग अभ्यास detach() भी है, लेकिन इसे अक्सर भुला दिया जाता है।

इसके बजाय, मैं xxx $ y या xxx [, "y"] का उपयोग करता हूं। यह अधिक पारदर्शी है।

एक और संभावना कई कार्यों में उपलब्ध डेटा तर्क का उपयोग करना है जो व्यक्तिगत चर को डेटा फ्रेम के संदर्भ में संदर्भित करने की अनुमति देता है। उदाहरण के लिए, lm(z ~ y, data=xxx)

+0

कभी-कभी मैं विभिन्न डेटा फ्रेम और वैश्विक चर से कॉल कर रहा हूं, और इस प्रणाली का मतलब है कि कभी गलत गणना नहीं की जाती है। – Michelle

8

संलग्नक के साथ मुख्य समस्या यह है कि इसका परिणाम अवांछित व्यवहार हो सकता है। मान लें कि आपके पास वर्कस्पेस में xyz नाम वाला ऑब्जेक्ट है। अब आप डेटाफ्रेम एबीसी संलग्न करते हैं जिसमें xyz नामक कॉलम है। यदि आपका कोड xyz का संदर्भ देता है, तो क्या आप गारंटी दे सकते हैं कि ऑब्जेक्ट या डेटाफ्रेम कॉलम के संदर्भ हैं? यदि आप अनुलग्नक का उपयोग नहीं करते हैं तो यह आसान है। बस xyz वस्तु को संदर्भित करता है। abc $ xyz डेटा फ्रेम के कॉलम को संदर्भित करता है।

टेक्स्टबुक में अक्सर संलग्न होने वाले मुख्य कारणों में से एक यह है कि यह कोड को छोटा करता है।

with(someDataFrame, someFunction(...)) 

यह भी एक रूप जहां subset पहला तर्क है स्वाभाविक रूप से देखा जाता है::

+0

मैंने देखा है कि कुछ पाठ्यपुस्तकें कहते हैं, "ऐसा न करें, उदाहरणों को सरल बनाने के लिए अनुलग्नक का उपयोग किया जा रहा है"। – Michelle

13

मैं बहुत with उपयोग करने के लिए एक एकल आदेश पर attach के बराबर प्राप्त करने के लिए पसंद करते हैं

with(subset(someDataFrame, someVar > someValue), 
     someFunction(...)) 

जो यह स्पष्ट करता है कि हम डेटा के चयन पर काम करते हैं। और जबकि कई मॉडलिंग फ़ंक्शन में data और subset तर्क हैं, ऊपर का उपयोग अधिक संगत है क्योंकि यह उन कार्यों पर भी लागू होता है जिनके पास data और subset तर्क नहीं हैं।

7

"अटैच" एक बुरा प्रलोभन है।केवल स्थान जहां यह अच्छी तरह से काम करता है कक्षा कक्षा में है जहां एक को एक डेटाफ्रेम दिया जाता है और उस डेटाफ्रेम पर विश्लेषण करने के लिए कोड की रेखाएं लिखने की अपेक्षा की जाती है। एक बार असाइनमेंट किए जाने के बाद उपयोगकर्ता को फिर से उस डेटा का उपयोग करने की संभावना नहीं है।

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

2

जबकि मैं भी attach() का उपयोग नहीं करना पसंद करता हूं, तब भी जब आपके पास किसी ऑब्जेक्ट को जारी रखने की आवश्यकता होती है (इस मामले में, data.frame) आपके प्रोग्राम के जीवन के दौरान आपके पास कई फ़ंक्शन हैं। ऑब्जेक्ट को हर आर फंक्शन में इस्तेमाल करने के बजाय, मुझे लगता है कि इसे एक ही स्थान पर रखना और इसके तत्वों को आवश्यकतानुसार कॉल करना अधिक सुविधाजनक है।

उस ने कहा, अगर मैं जानता हूं कि मुझे कितनी मेमोरी उपलब्ध है और केवल तभी मैं यह सुनिश्चित कर दूं कि detach() यह data.frame एक बार यह दायरे से बाहर हो गया है।

क्या मुझे समझ में आ रहा है?

3

जैसा कि लियोनी ने कहा, with और withinattach के लिए बिल्कुल सही विकल्प हैं, लेकिन मैं इसे पूरी तरह से बर्खास्त नहीं करूँगा। मैं कभी-कभी इसका उपयोग करता हूं, जब मैं सीधे आर प्रॉम्प्ट पर काम कर रहा हूं और स्क्रिप्ट पर लिखने से पहले कुछ आदेशों का परीक्षण करना चाहता हूं। खासकर जब एकाधिक कमांड का परीक्षण करते हैं, attachwith और within के लिए एक और अधिक रोचक, सुविधाजनक और यहां तक ​​कि हानिरहित विकल्प भी हो सकता है, क्योंकि attach चलाने के बाद, कमांड प्रॉम्प्ट आपके लिए इनपुट लिखने और आउटपुट देखने के लिए स्पष्ट है।

बस यह सुनिश्चित करने के बाद detach अपने डेटा को सुनिश्चित करें!

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