Menu
CoddyTech

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.5

mapply() 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 9

Vektor 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)"
challenge icon

Tantangan

Mudah

Lengkapi 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")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler R online