संक्षिप्त पृष्ठभूमि: कई (अधिकांश?) समकालीन प्रोग्रामिंग भाषाओं में व्यापक उपयोग में कम से कम 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 list
s अन्य मानचित्र-प्रकार 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
लागू करता है ; मैं निश्चित रूप से इस पैकेज की सिफारिश कर सकता हूं।)
list
R एक हैश की तरह नहीं है। मेरे पास एक और है जो मुझे लगता है कि ध्यान देने योग्य है। list
R में एक ही संदर्भ नाम के साथ दो सदस्य हो सकते हैं। इस बात पर विचार करें कि 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]]
। पहला एक सूची देता है और दूसरा एक संख्यात्मक वेक्टर देता है। नीचे स्क्रॉल करते हुए मुझे प्रतीत होता है कि डिर्क इस प्रश्न को सही ढंग से संबोधित करने के लिए एकमात्र प्रतिवादी था।