Map i mapply
Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 33 z 64.
Map(f, xs, ys) przechodzi równolegle przez dwa lub więcej wektorów i wywołuje f z jednym elementem z każdego z nich: najpierw z pierwszymi elementami, potem z drugimi elementami i tak dalej. Zwraca listę:
totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])Wynik:
[1] 3
[1] 7.5mapply() to uproszczona wersja, podobnie jak sapply() dla kilku wektorów. unlist() również spłaszcza listę z Map() do wektora:
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)))Wynik:
[1] 8.0 12.0 7.5
[1] 5 7 9Wektory są dopasowywane według pozycji, więc muszą mieć tę samą długość. mapply() nadaje wynikom tekstowym nazwy na podstawie pierwszego wektora; USE.NAMES = FALSE usuwa nazwy:
items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)Wynik:
[1] "2 x tea" "3 x jam"Gdy każda para wymaga instrukcji if, napisz funkcję z kilkoma argumentami i przekaż ją do mapply(). Warunek jest wtedy sprawdzany raz dla każdej pary:
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))Wynik:
[1] "Ada (adult)" "Tim (minor)"Wyzwanie
ŁatwyUzupełnij order_lines(items, qty, prices). Zwróć po jednym wierszu na element, 2 x tea = 8.00: ilość, x , element, = oraz iloczyn ilości i ceny zapisany z dwoma miejscami po przecinku. Użyj mapply() lub Map().
Dostarczony kod odczytuje elementy, ilości i ceny z trzech wierszy rozdzielonych przecinkami, a następnie wypisuje każdy zwrócony wiersz.
Spróbuj swoich sił
order_lines <- function(items, qty, prices) {
# Wpisz tutaj swój kod
character(0)
}
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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")
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Łańcuchy znaków w szczegółach
Podciągi za pomocą substr()Formatowanie za pomocą sprintf()Dzielenie i łączenieWyszukiwanie w łańcuchach znakówZastępowanie tekstuPowtórka – kreator nazwy użytkownika4Macierze
Tworzenie macierzyIndeksowanie macierzyPodsumowania wierszy i kolumnDziałania na macierzachPowtórka – plan miejsc10Zaawansowane sterowanie przepływem
Funkcja switch()Wektorowe ifelse()repeat i breakFunkcje rekurencyjnePodsumowanie — klasyfikator ocen2Wyszukiwanie wartości po kluczach
Wyszukiwanie nazwanych elementów wektoraSprawdzanie kluczyDodawanie i usuwanie kluczyIterowanie po nazwachPowtórzenie — giełda5Projekt — dziennik ocen
Dodawanie uczniówZapisywanie ocen3Zbiory i zliczanie
Unikalne wartościOperacje na zbiorachTesty przynależnościZliczanie za pomocą table()Podsumowanie — goście wydarzenia6Funkcje jako wartości
Funkcje anonimowePrzekazywanie funkcjiZwracanie funkcjiDomknięcia ze stanemPowtórka — reguły rabatowe9Ramki danych
Tworzenie ramek danychKolumny i wierszeFiltrowanie wierszyDodawanie i sortowaniePodsumowanie – raport sprzedaży12Projekt – śledzenie wydatków
Rejestrowanie wydatkówŁączne wydatkiPoćwicz samodzielnie: Kompilator R online