list في R هي مجموعة مرتّبة من العناصر، وتختلف عن vectors في عدة نواحٍ:
numeric مع character).المقارنات مع لغات أخرى ليست دقيقة.
تشبه list في R قاموس Python إلى حد ما، لكن list مرتّبة ويمكن الوصول إليها بفهرس عددي.
وهي تشبه struct في C إلى حد ما، إلا أن 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().
تسوية البنية مفيدة في هذه الحالة البسيطة، لكنها قد تفاجئك مع عناصر مصفوفة أكثر تعقيدًا.
تُخزَّن list، مثل vector الذري، بشكل متجاور. والفرق أن المتجهات العددية والمنطقية تخزّن القيم، أما المصفوفة فتخزّن مراجع إلى كائنات موجودة في مكان آخر من الذاكرة.
نادرًا ما تكون معرفة ذلك مهمة لمستخدم R، لكنها قد تفيد في مجتمع متعدد اللغات مثل Exercism المبرمجين الملمّين بلغات أخرى.