Map dan mapply
Termasuk bagian Logika dan Alur dalam perjalanan R di Coddy. Pelajaran 33 dari 64.
Map(f, xs, ys) menelusuri dua vektor atau lebih secara bersamaan dan memanggil f dengan satu elemen dari setiap vektor: pertama dengan elemen pertama, lalu dengan elemen kedua, dan seterusnya. Fungsi ini mengembalikan list:
totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])Output:
[1] 3
[1] 7.5mapply() adalah versi yang menyederhanakan, seperti sapply() untuk beberapa vektor. unlist() juga meratakan list dari Map() menjadi vektor:
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)))Output:
[1] 8.0 12.0 7.5
[1] 5 7 9Vektor dicocokkan berdasarkan posisi, jadi panjangnya harus sama. mapply() memberi nama pada hasil teks berdasarkan vektor pertama; USE.NAMES = FALSE menghapus nama:
items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)Output:
[1] "2 x tea" "3 x jam"Saat setiap pasangan memerlukan if, tulis fungsi dengan beberapa argumen dan berikan fungsi itu ke mapply(). Kondisi tersebut lalu dijalankan satu kali untuk setiap pasangan:
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))Output:
[1] "Ada (adult)" "Tim (minor)"Tantangan
MudahLengkapi order_lines(items, qty, prices). Kembalikan satu baris untuk setiap item, 2 x tea = 8.00: kuantitas, x , item, = dan kuantitas dikalikan harga dengan dua angka desimal. Gunakan mapply() atau Map().
Code yang disediakan membaca item, kuantitas, dan harga sebagai tiga baris yang dipisahkan koma, lalu mencetak setiap baris yang dikembalikan.
Coba sendiri
order_lines <- function(items, qty, prices) {
# Tulis kodemu di sini
character(0)
}
# Kode input/output yang disediakan: biarkan apa adanya
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")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Mendalami string
Substring dengan substr()Memformat dengan sprintf()Memisahkan dan MenggabungkanMencari stringMengganti TeksRangkuman: Pembuat Nama Pengguna4Matriks
Membuat MatriksMengakses Elemen MatriksRingkasan Baris dan KolomAritmetika MatriksRangkuman: Denah Tempat Duduk2Pencarian Nilai-Kunci
Pencarian pada Vector BernamaMemeriksa KunciMenambahkan dan Menghapus KunciMenelusuri NamaUlasan: Meja Saham5Proyek, Buku Nilai
Menambahkan SiswaMencatat Nilai3Set dan Penghitungan
Nilai UnikOperasi setPengujian KeanggotaanMenghitung dengan table()Ulasan: Tamu Acara6Fungsi sebagai Nilai
Fungsi AnonimMengirim FungsiMengembalikan FungsiClosure dengan StateRangkuman: Aturan Diskon9Data Frame
Membuat Data FrameKolom dan BarisMemfilter BarisMenambahkan dan MengurutkanRangkuman: Laporan Penjualan12Proyek: Pelacak Pengeluaran
Mencatat PengeluaranTotal PengeluaranLatihan sendiri: Compiler R online