Це важливе поняття в R. Щоб краще зрозуміти ці варіанти, корисно поглянути на розмірність вхідних і вихідних даних різних функцій.
Ми вже бачили функції, які приймають вектор і повертають одне скалярне значення:
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
До цієї категорії належить і багато статистичних функцій, як-от mean().
Для логічних векторів є all() і any().
Багато функцій в R працюють з цілими векторами й часто повертають вектор. Це стосується більшості математичних функцій:
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
Це не лише стисло і зручно, адже не потрібні цикли, спискові включення чи рекурсія, поширені в інших мовах. В R векторні функції часто працюють значно швидше, ніж ці прийоми.
Для сортування вектора є sort(), яка повертає значення, і order(), яка повертає індекси:
> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am" "I" "in" "not" "order"
> order(v)
#> [1] 2 1 4 3 5
Типово сортування відбувається за зростанням.
Якщо потрібно, вкажімо decreasing = TRUE або скористаймося rev(), щоб обернути наявний вектор.
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
Є також функції, які створюють кумулятивні вектори, обробляючи вхідний вектор зліва направо:
> cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
> cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
Це поняття можна також поширити на порівняння векторів.
Наприклад, розгляньмо функцію pmax(), яка знаходить максимум для кожної пари:
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
Ми завзяті спостерігачі за птахами, які ведуть облік того, скільки птахів відвідало наш сад за останні сім днів.
У нас шість завдань, і всі вони стосуються кількості птахів, що відвідали наш сад.
Реалізуйте функцію today(), яка повертає кількість птахів, що відвідали наш сад сьогодні. Кількість птахів упорядковано за днями: перший елемент містить кількість за найдавніший день, а останній - сьогоднішню кількість.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
Реалізуйте функцію increment_todays_count(), яка збільшує сьогоднішню кількість на одиницю:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
Реалізуйте функцію has_day_without_birds(), яка повертає TRUE, якщо був день, коли жоден птах не відвідав наш сад; інакше повертає FALSE:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
Реалізуйте функцію count_for_first_days(), яка повертає кількість птахів, що відвідали наш сад від початку тижня, але обмежує підрахунок указаною кількістю днів від початку тижня.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
Деякі дні жвавіші за інші. Жвавим вважається день, коли наш сад відвідали пʼять або більше птахів.
Реалізуйте функцію busy_days(), яка повертає кількість жвавих днів:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
Нам цікаво, скільки всього птахів відвідало сад за цей тиждень. Обчисліть накопичувальні підсумки для кожного дня.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
Ми підозрюємо, що на відвідування птахів впливають закономірності руху на сусідніх дорогах, а отже вихідні відрізняються від буднів.
Відсортуйте скорочені назви днів у спадному порядку за кількістю птахів, що відвідали сад.
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
Зареєструйтеся на Exercism, щоб вивчати й опановувати R, а також 21 концепція111 вправ та справжнє наставництво від людей, і все це безкоштовно.