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.5mapply() هي النسخة المُبسطة، مثل 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)"التحدي
سهلأكمل 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")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1السلاسل النصية بعمق
السلاسل الفرعية باستخدام substr()التنسيق باستخدام sprintf()التقسيم والضمالبحث في السلاسل النصيةاستبدال النصوصمراجعة - منشئ اسم المستخدم4المصفوفات
إنشاء المصفوفاتفهرسة المصفوفاتملخصات الصفوف والأعمدةالحساب على المصفوفاتمراجعة - مخطط المقاعد2استرجاع القيم باستخدام المفاتيح
البحث في المتجهات المُسمّاةالتحقق من المفاتيحإضافة المفاتيح وإزالتهاالتكرار عبر الأسماءمراجعة - مكتب الأسهمتدرّب بنفسك: مترجم R عبر الإنترنت