Map ve mapply
Coddy'nin R Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 33 / 64.
Map(f, xs, ys) iki veya daha fazla vektörün üzerinden adım adım geçer ve f fonksiyonunu her birinden bir öğeyle çağırır: önce ilk öğelerle, sonra ikinci öğelerle ve bu şekilde devam eder. Bir liste döndürür:
totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])Çıktı:
[1] 3
[1] 7.5mapply(), birkaç vektör için sapply() gibi basitleştirilmiş sürümdür. unlist() ayrıca Map() listesini bir vektöre düzleştirir:
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)))Çıktı:
[1] 8.0 12.0 7.5
[1] 5 7 9Vektörler konuma göre eşleştirilir, bu nedenle aynı uzunlukta olmaları gerekir. mapply(), metin sonuçlarını ilk vektörden sonra adlandırır; USE.NAMES = FALSE adları kaldırır:
items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)Çıktı:
[1] "2 x tea" "3 x jam"Her çift için bir if gerektiğinde, birkaç bağımsız değişken alan bir işlev yazın ve bunu mapply() işlevine aktarın. Koşul daha sonra her çift için bir kez çalışır:
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))Çıktı:
[1] "Ada (adult)" "Tim (minor)"Görev
Kolayorder_lines(items, qty, prices) işlevini tamamla. Her öğe için bir satır döndür; 2 x tea = 8.00: miktar, x , öğe, = ve miktarın fiyatla çarpımını iki ondalık basamakla göster. mapply() veya Map() kullan.
Sağlanan kod, öğeleri, miktarları ve fiyatları virgülle ayrılmış üç satır olarak okur ve döndürülen her satırı yazdırır.
Kendin dene
order_lines <- function(items, qty, prices) {
# Kodunuzu buraya yazın
character(0)
}
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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")
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Dizeleri Derinlemesine
substr() ile Alt Dizelersprintf() ile BiçimlendirmeBölme ve BirleştirmeDizelerde AramaMetin DeğiştirmeTekrar - Kullanıcı Adı Oluşturucu4Matrisler
Matris OluşturmaMatrisleri İndekslemeSatır ve Sütun ÖzetleriMatris AritmetiğiTekrar - Oturma Planı2Anahtar-Değer Aramaları
Adlandırılmış Vektör AramalarıAnahtarları DenetlemeAnahtar Ekleme ve KaldırmaAdlar Üzerinde DöngüTekrar - Hisse Senedi Masası5Proje - Not Defteri
Öğrenci EklemeNotları Kaydetme3Kümeler ve Sayma
Benzersiz DeğerlerKüme İşlemleriÜyelik Testleritable() ile SaymaTekrar - Etkinlik Konukları6Değer Olarak Fonksiyonlar
Anonim FonksiyonlarFonksiyonları GeçirmeFonksiyon DöndürmeDurum Bilgili Closure'larTekrar - İndirim Kuralları9Veri Çerçeveleri
Veri Çerçeveleri OluşturmaSütunlar ve SatırlarSatırları FiltrelemeEkleme ve SıralamaTekrar - Satış Raporu12Proje - Harcama Takipçisi
Harcamaları KaydetmeToplam HarcamaKendi başına pratik yap: Online R derleyicisi