Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Map و mapply

جزء من قسم المنطق وتدفق التنفيذ في رحلة R على Coddy. الدرس 33 من 64.

Map(f, xs, ys) يمر عبر متجهين أو أكثر بالتوازي ويستدعي f مع عنصر واحد من كل متجه: أولًا مع العناصر الأولى، ثم مع العناصر الثانية، وهكذا. ويُرجع قائمة:

totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])

الناتج:

[1] 3
[1] 7.5

mapply() هي النسخة المُبسطة، مثل sapply() لعدة متجهات. كما أن unlist() تعمل على تسطيح القائمة الناتجة من Map() إلى متجه:

print(mapply(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5)))
print(unlist(Map(function(a, b) a + b, 1:3, 4:6)))

الناتج:

[1]  8.0 12.0  7.5
[1] 5 7 9

تتم مطابقة المتجهات حسب الموضع، لذا يجب أن تكون لها الطول نفسه. تُسمّي mapply() نتائج النص بعد المتجه الأول؛ ويزيل USE.NAMES = FALSE الأسماء:

items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)

الناتج:

[1] "2 x tea" "3 x jam"

عندما يحتاج كل زوج إلى if، اكتب دالةً بعدة معاملات ومرّرها إلى mapply(). ثم يُنفَّذ الشرط مرة واحدة لكل زوج:

describe <- function(name, age) {
  group <- if (age < 18) "minor" else "adult"
  paste0(name, " (", group, ")")
}
print(mapply(describe, c("Ada", "Tim"), c(36, 12), USE.NAMES = FALSE))

الناتج:

[1] "Ada (adult)" "Tim (minor)"
challenge icon

التحدي

سهل

أكمل order_lines(items, qty, prices). أعد سطرًا واحدًا لكل عنصر، مثل 2 x tea = 8.00: الكمية، ثم x ، ثم العنصر، ثم = ، ثم حاصل ضرب الكمية في السعر مع منزلتين عشريتين. استخدم mapply() أو Map().

يقرأ الكود المُقدَّم العناصر والكميات والأسعار باعتبارها ثلاثة أسطر مفصولة بفواصل، ثم يطبع كل سطر مُعاد.

جرّب بنفسك

order_lines <- function(items, qty, prices) {
  # اكتب الكود الخاص بك هنا
  character(0)
}

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
cat(order_lines(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]]), as.numeric(strsplit(input[3], ",")[[1]])), sep = "\n")
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم R عبر الإنترنت