संक्षिप्त पृष्ठभूमि: कई (अधिकांश?) समकालीन प्रोग्रामिंग भाषाओं में व्यापक उपयोग में कम से कम ADTs [अमूर्त डेटा प्रकार] की एक मुट्ठी भर है, विशेष रूप से,
स्ट्रिंग (एक अनुक्रम जिसमें वर्ण शामिल हैं)
सूची (मूल्यों का आदेश दिया गया संग्रह), और
मानचित्र-आधारित प्रकार (मानों की कुंजियाँ प्रदर्शित करने वाला एक अनियंत्रित सरणी)
आर प्रोग्रामिंग भाषा में, पहले दो को क्रमशः characterऔर vector, के रूप में लागू किया जाता है।
जब मैंने आर सीखना शुरू किया, तो शुरू से ही दो चीजें लगभग स्पष्ट थीं: listआर में सबसे महत्वपूर्ण डेटा प्रकार है (क्योंकि यह आर के लिए मूल वर्ग है data.frame), और दूसरा, मैं अभी समझ नहीं पाया कि उन्होंने कैसे काम किया, कम से कम मेरे कोड में उन्हें सही ढंग से उपयोग करने के लिए पर्याप्त नहीं है।
एक बात के लिए, यह मुझे लग रहा था कि आर का listडेटा टाइप एडीटी ( dictionaryपायथन में, NSMutableDictionaryऑब्जेक्टिव सी में, hashपर्ल और रूबी में, object literalजावास्क्रिप्ट में, और इसके आगे) मैप का एक सीधा कार्यान्वयन था ।
उदाहरण के लिए, आप उन्हें वैसे ही बनाते हैं, जैसे आप एक पायथन डिक्शनरी को, एक कंस्ट्रक्टर को की-वैल्यू पेयर पास करके (जो पायथन में dictनहीं है list):
x = list("ev1"=10, "ev2"=15, "rv"="Group 1")
और आप आर लिस्ट की वस्तुओं को वैसे ही एक्सेस करते हैं जैसे आप पायथन डिक्शनरी के होते हैं, जैसे x['ev1'],। इसी तरह, आप केवल 'कुंजियाँ' या 'मूल्यों' को पुनः प्राप्त कर सकते हैं :
names(x) # fetch just the 'keys' of an R list
# [1] "ev1" "ev2" "rv"
unlist(x) # fetch just the 'values' of an R list
# ev1 ev2 rv
# "10" "15" "Group 1"
x = list("a"=6, "b"=9, "c"=3)
sum(unlist(x))
# [1] 18
लेकिन R lists अन्य मानचित्र-प्रकार ADTs (मैं वैसे भी सीखी गई भाषाओं में से) के विपरीत हैं । मेरा अनुमान है कि यह एस के लिए प्रारंभिक युक्ति का एक परिणाम है, अर्थात, एक डेटा / आँकड़े डीएसएल [डोमेन-विशिष्ट भाषा] को डिजाइन करने का इरादा है।
listव्यापक उपयोग में अन्य भाषाओं में R s और मैपिंग प्रकारों के बीच तीन महत्वपूर्ण अंतर (जैसे, पायथन, पर्ल, जावास्क्रिप्ट):
listआर में पहले , s एक ऑर्डर किए गए संग्रह हैं, वैक्टर की तरह, भले ही मानों को कुंजीबद्ध किया गया हो (यानी, चाबियाँ किसी भी हैशनेबल मूल्य हो सकती हैं न कि केवल अनुक्रमिक पूर्णांक)। लगभग हमेशा, अन्य भाषाओं में डेटा प्रकार मैपिंग अनियंत्रित है ।
दूसरा , listरों कार्यों भले ही आप एक में पारित कर दिया कभी नहीं से लौटाया जा सकता listहै जब आप समारोह कहा जाता है, और भले ही समारोह है कि लौटे listएक (स्पष्ट) शामिल नहीं है list(निर्माता बेशक, आप इस के साथ व्यवहार में से निपट सकते हैं कॉल में दिए गए परिणाम को लपेटकर unlist):
x = strsplit(LETTERS[1:10], "") # passing in an object of type 'character'
class(x) # returns 'list', not a vector of length 2
# [1] list
आर के एस की एक तीसरी अजीब विशेषता list: ऐसा नहीं लगता है कि वे एक और एडीटी के सदस्य हो सकते हैं, और यदि आप ऐसा करने की कोशिश करते हैं, तो प्राथमिक कंटेनर एक के लिए मजबूर है list। उदाहरण के लिए,
x = c(0.5, 0.8, 0.23, list(0.5, 0.2, 0.9), recursive=TRUE)
class(x)
# [1] list
यहाँ मेरा इरादा भाषा की आलोचना या इसे कैसे प्रलेखित करना है; इसी तरह, मैं सुझाव नहीं दे रहा हूं कि listडेटा संरचना के साथ कुछ गलत है या यह कैसे व्यवहार करता है। मेरे पास सब कुछ सही होने के बारे में मेरी समझ है कि वे कैसे काम करते हैं इसलिए मैं अपने कोड में उनका सही उपयोग कर सकता हूं।
यहाँ उन चीज़ों के बारे में बताया गया है जिन्हें मैं बेहतर समझना चाहता हूँ:
वे कौन से नियम हैं जो निर्धारित करते हैं कि फ़ंक्शन कॉल कब लौटेगी
list(उदाहरण के लिए,strsplitऊपर सुनाई गई अभिव्यक्ति)?अगर मैं स्पष्ट रूप से
list(जैसेlist(10,20,30,40)) नामों को निर्दिष्ट नहीं करता हूं, तो क्या डिफ़ॉल्ट नाम सिर्फ 1 से शुरू होने वाले अनुक्रमिक पूर्णांक हैं? (मुझे लगता है, लेकिन मैं इस बात से बहुत दूर हूं कि इसका उत्तर हां में है, अन्यथा हम इस प्रकार केlistवेक्टर w / / के लिए कॉल करने में सक्षम नहीं होंगेunlist।ये दो अलग-अलग ऑपरेटर
[], और[[]], एक ही परिणाम क्यों लौटाते हैं ?x = list(1, 2, 3, 4)दोनों अभिव्यक्तियाँ "1":
x[1]x[[1]]ये दोनों भाव एक ही परिणाम क्यों नहीं देते हैं?
x = list(1, 2, 3, 4)x2 = list(1:4)
कृपया मुझे आर डॉक्युमेंटेशन ( ?list, R-intro) की ओर इशारा न करें - मैंने इसे ध्यान से पढ़ा है और इससे मुझे उन प्रश्नों के उत्तर देने में मदद नहीं मिलती है, जो मैंने अभी-अभी पढ़े हैं।
(अंत में, मैंने हाल ही में आर 4 पैकेज (सीआरएएन पर उपलब्ध) का उपयोग करना शुरू किया, जिसे एक एस 4 वर्ग के माध्यम से पारंपरिक मानचित्र-प्रकार के व्यवहार को hashलागू करता है ; मैं निश्चित रूप से इस पैकेज की सिफारिश कर सकता हूं।)
listR एक हैश की तरह नहीं है। मेरे पास एक और है जो मुझे लगता है कि ध्यान देने योग्य है। listR में एक ही संदर्भ नाम के साथ दो सदस्य हो सकते हैं। इस बात पर विचार करें कि obj <- c(list(a=1),list(a=2))यह मान्य है और 'a' के दो नामित मूल्यों के साथ एक सूची देता है। इस उदाहरण में कॉल के लिए obj["a"]केवल पहला मिलान सूची तत्व वापस आ जाएगा। आप x <- new.env(); x[["a"]] <- 1; x[["a"]] <- 2; x[["a"]]
x = list(1, 2, 3, 4), ये दोनों एक ही परिणाम नहीं देते हैं:x[1]औरx[[1]]। पहला एक सूची देता है और दूसरा एक संख्यात्मक वेक्टर देता है। नीचे स्क्रॉल करते हुए मुझे प्रतीत होता है कि डिर्क इस प्रश्न को सही ढंग से संबोधित करने के लिए एकमात्र प्रतिवादी था।