ال

القوائم في R

1 تمرين

نبذة عن القوائم

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"

الوصول إلى عناصر المصفوفة

هناك ثلاثة أساليب للقيام بذلك، ولكل منها فائدة في سياقات مختلفة.

1. باستخدام صيغة $tag

شائعة جدًا إذا كانت أسماء الوسوم معروفة مسبقًا.

point <- list(x = 5.3, y = 4.2, color = "blue")
#> point$x
#> [1] 5.3
#> point$color
#> [1] "blue"

2. باستخدام صيغة [[tag]]

لهذا الأسلوب ميزة أن اسم الوسم يمكن اختياره أثناء التنفيذ. لاحظ الأقواس المزدوجة.

want <- "y"
point[[want]] # same as point$y
#> [1] 4.2

3. باستخدام فهرس الموضع

يعمل هذا سواء كانت للمصفوفة وسوم أم لا. ومرة أخرى، الأقواس مزدوجة.

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. خذ العنصر الأول باستخدام [[1]]
  2. استخدم الدالة unlist().
pt <-point["color"]

pt[[1]]
#> [1] "red" # simple 1-element vector

unlist(pt)
#> color 
#> "red"  # 1-element vector with name

كن حذرًا مع unlist(). تسوية البنية مفيدة في هذه الحالة البسيطة، لكنها قد تفاجئك مع عناصر مصفوفة أكثر تعقيدًا.

Advanced

التمثيل الداخلي

تُخزَّن list، مثل vector الذري، بشكل متجاور. والفرق أن المتجهات العددية والمنطقية تخزّن القيم، أما المصفوفة فتخزّن مراجع إلى كائنات موجودة في مكان آخر من الذاكرة.

نادرًا ما تكون معرفة ذلك مهمة لمستخدم R، لكنها قد تفيد في مجتمع متعدد اللغات مثل Exercism المبرمجين الملمّين بلغات أخرى.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم القوائم