R में list चीज़ों का एक ऐसा संग्रह है जिसमें क्रम बना रहता है, और यह कई मामलों में vectors से अलग होता है:
numeric को character के साथ मिलाना)।दूसरी भाषाओं से इसकी तुलना करना पूरी तरह ठीक नहीं बैठता।
R का list कुछ हद तक Python की डिक्शनरी जैसा होता है, लेकिन इसमें क्रम बना रहता है और इसे संख्या वाले इंडेक्स से एक्सेस किया जा सकता है।
यह C के struct जैसा भी कुछ-कुछ लगता है, बस फर्क यह है कि list को प्रोग्राम चलते समय आसानी से बढ़ाया जा सकता है।
वेक्टर की तुलना में ऐरे में एलिमेंट को नाम देना (जिन्हें अक्सर "टैग" कहा जाता है) ज़्यादा आम है:
list(x = 5.3, y = 4.2, color = "blue")
#> $x
#> [1] 5.3
#> $y
#> [1] 4.2
#> $color
#> [1] "blue"
लेकिन टैग देना ज़रूरी नहीं है, और तब R सिर्फ इंडेक्स संख्याएँ इस्तेमाल करता है:
list(5.3, 4.2, "blue")
#> [[1]]
#> [1] 5.3
#> [[2]]
#> [1] 4.2
#> [[3]]
#> [1] "blue"
ऐसा करने के तीन तरीके हैं, और हर तरीका अलग-अलग जगह काम आता है।
$tag नोटेशन सेजब टैग के नाम पहले से पता हों, तो यह बहुत आम है।
point <- list(x = 5.3, y = 4.2, color = "blue")
#> point$x
#> [1] 5.3
#> point$color
#> [1] "blue"
[[tag]] नोटेशन सेइसका फायदा यह है कि टैग का नाम प्रोग्राम चलते समय चुना जा सकता है। ध्यान दीजिए कि यहाँ ब्रैकेट दोहरे हैं।
want <- "y"
point[[want]] # same as point$y
#> [1] 4.2
यह तरीका तब भी काम करता है जब ऐरे में टैग हों, और तब भी जब न हों। यहाँ भी ब्रैकेट दोहरे हैं।
point[[3]] # same as point$color
#> [1] "blue"
यह आसान है: किसी एलिमेंट को वैल्यू असाइन करने पर अगर वह एलिमेंट पहले से है तो उसकी वैल्यू बदल जाती है, और अगर नया है तो जुड़ जाता है।
point$color <- "red"
point$trust <- TRUE
# str() gives more compact output than the default display
str(point)
#> List of 4
#> $ x : num 5.3
#> $ y : num 4.2
#> $ color: chr "red"
#> $ trust: logi TRUE
किसी एलिमेंट को हटाने के लिए उस अनचाहे एलिमेंट को NULL असाइन कीजिए।
point$trust <- NULL
str(point)
#> List of 3
#> $ x : num 5.3
#> $ y : num 4.2
#> $ color: chr "red"
vector क्लास को तकनीकी रूप से atomic vector कहा जाता है, क्योंकि वह केवल एटॉमिक वैल्यू ही रख सकती है: numeric, character, boolean, आदि।
चूँकि एक list में दूसरे ऐरे भी रह सकते हैं, इसलिए इसे recursive vector भी कहा जाता है।
यह केवल नामकरण की तकनीकी बात नहीं है, बल्कि यह भी याद दिलाता है कि ऐरे की संरचना मनमाने ढंग से जटिल हो सकती है। किसी ऐरे के एलिमेंट को एक्सेस करते समय क्या मिलेगा, यह समझना प्रोग्रामर की ज़िम्मेदारी है।
ऊपर कुछ उदाहरणों में ऐरे के एलिमेंट तक पहुँचने के लिए दोहरे ब्रैकेट [[ ]] इस्तेमाल हुए थे।
यह एलिमेंट को समतल करके उसके मूल टाइप में बदलने की कोशिश करता है, जो तब काम आता है जब आपको सिर्फ एक संख्या या एक स्ट्रिंग चाहिए हो।
एकेले ब्रैकेट [ ] इस्तेमाल करने पर यह समतल करना नहीं होता, और जो वैल्यू लौटती है वह एक सबलिस्ट होती है।
point[["color"]]
#> [1] "red" # flattened
point["color"]
#> $color
#> [1] "red" # sublist
भले ही शुरुआती R प्रोग्रामर को सबलिस्ट न चाहिए हो, फिर भी इसके बारे में जानना ज़रूरी है।
ज़्यादा से ज़्यादा लचीलेपन के लिए R के कई मानक फंक्शन list लौटाते हैं, भले ही उसमें यहाँ की तरह एक ही एटॉमिक वैल्यू हो।
किसी वेक्टर में बदलने के दो तरीके हैं।
[[1]] से पहला एलिमेंट निकालिएunlist() फंक्शन इस्तेमाल कीजिए।pt <-point["color"]
pt[[1]]
#> [1] "red" # simple 1-element vector
unlist(pt)
#> color
#> "red" # 1-element vector with name
unlist() के साथ सावधान रहिए।
इस आसान मामले में संरचना को समतल करना काम आता है, लेकिन जटिल ऐरे एलिमेंट के साथ यह अचानक मुश्किलें खड़ी कर सकता है।
एटॉमिक vector की तरह एक list भी लगातार जगह में संग्रहीत होता है। फर्क यह है कि numeric और boolean वेक्टर वैल्यू संग्रहीत करते हैं, जबकि ऐरे रेफरेंस संग्रहीत करता है, जो मेमोरी में कहीं और रखी ऑब्जेक्ट की ओर इशारा करते हैं।
R इस्तेमाल करने वाले के लिए यह जानना शायद ही कभी ज़रूरी होता है, लेकिन Exercism जैसे बहुभाषी समुदाय में यह उन प्रोग्रामर के काम आ सकता है जो दूसरी भाषाओं से परिचित हैं।