r - `[` सबसेट 'से बेहतर क्यों है?




1 Answers

@James द्वारा टिप्पणियों में इस प्रश्न का उत्तर दिया गया था, जो subset (और इस तरह के कार्यों) के खतरों के हैडली विकम द्वारा उत्कृष्ट स्पष्टीकरण की ओर इशारा करता है। इसे पढ़ें!

यह कुछ हद तक पढ़ा गया है, इसलिए यहां उदाहरण रिकॉर्ड करना उपयोगी हो सकता है कि हैडली का उपयोग करता है कि "गलत क्या हो सकता है?" के सवाल को सीधे संबोधित करते हैं:

हैडली निम्नलिखित उदाहरण सुझाता है: मान लीजिए कि हम सबसेट करना चाहते हैं और फिर निम्नलिखित फ़ंक्शंस का उपयोग करके डेटा फ्रेम को पुन: व्यवस्थित करना चाहते हैं:

scramble <- function(x) x[sample(nrow(x)), ]

subscramble <- function(x, condition) {
  scramble(subset(x, condition))
}

subscramble(mtcars, cyl == 4)

यह त्रुटि देता है:

Eval में त्रुटि (expr, envir, enclos): ऑब्जेक्ट 'cyl' नहीं मिला

क्योंकि आर अब "जानता है" कहां 'सिल' नामक वस्तु को खोजने के लिए नहीं है। वह वास्तव में विचित्र सामान बताते हैं जो हो सकता है अगर मौके से वैश्विक वातावरण में 'सिल' नामक वस्तु है:

cyl <- 4
subscramble(mtcars, cyl == 4)

cyl <- sample(10, 100, rep = T)
subscramble(mtcars, cyl == 4)

(उन्हें चलाएं और खुद के लिए देखें, यह बहुत पागल है।)

जब मुझे डेटा.फ्रेम फ़िल्टर करने की आवश्यकता होती है, यानी, कुछ स्थितियों को पूरा करने वाली पंक्तियों को निकालने के लिए, मैं subset फ़ंक्शन का उपयोग करना पसंद करता हूं:

subset(airquality, Month == 8 & Temp > 90)

[ समारोह के बजाय:

airquality[airquality$Month == 8 & airquality$Temp > 90, ]

मेरी प्राथमिकता के दो मुख्य कारण हैं:

  1. मुझे लगता है कि कोड बाएं से दाएं, बेहतर पढ़ता है। यहां तक ​​कि जो लोग आर के बारे में कुछ भी नहीं जानते हैं, वे बता सकते हैं कि ऊपर subset स्टेटमेंट क्या कर रहा है।

  2. चूंकि कॉलम को select अभिव्यक्ति में चर के रूप में संदर्भित किया जा सकता है, इसलिए मैं कुछ कीस्ट्रोक सहेज सकता हूं। उपरोक्त मेरे उदाहरण में, मुझे केवल एक बार subset साथ airquality टाइप करना पड़ा, लेकिन तीन बार [

तो मैं हर जगह subset का उपयोग करके खुश रह रहा था क्योंकि यह छोटा है और बेहतर पढ़ता है, यहां तक ​​कि अपने साथी आर कोडर्स को अपनी सुंदरता की वकालत भी करता है। लेकिन कल मेरी दुनिया अलग हो गई। subset दस्तावेज पढ़ने के दौरान, मैं इस खंड को नोटिस करता हूं:

चेतावनी

यह एक सुविधाजनक कार्य है जिसका उद्देश्य इंटरैक्टिव रूप से उपयोग के लिए है। प्रोग्रामिंग के लिए मानक सबसेटिंग फ़ंक्शंस का उपयोग करना बेहतर होता है [, और विशेष रूप से तर्क सबसेट के गैर-मानक मूल्यांकन में अप्रत्याशित परिणाम हो सकते हैं।

क्या कोई लेखक को समझने में मदद कर सकता है?

सबसे पहले, " इंटरैक्टिव रूप से उपयोग के लिए " उनका क्या अर्थ है? मुझे पता है कि एक इंटरैक्टिव सत्र क्या है, बैच मोड में चलने वाली एक स्क्रिप्ट के विपरीत, लेकिन मुझे नहीं लगता कि इसे क्या अंतर करना चाहिए।

फिर, क्या आप कृपया " तर्क सबसेट के गैर मानक मूल्यांकन " की व्याख्या कर सकते हैं और यह खतरनाक क्यों है, शायद एक उदाहरण प्रदान करें?




Related

r filter subset r-faq