13  Створення функцій

Автор

Юрій Клебан

Опубліковано

3/18/23

13.1 Понятя функції та синтаксис створення

Усі мови програмування окрім набору вбудованих функцій також дозволяють створювати власні функції, що інколи жє наобхідним для вирішення задачі, а інколи спрощує написаний код та полегшує його тестування.

Усі функції мають кілька спільних характеристик:

  • Функція - це блок коду, що виконується при її виклику по імені.
  • Функція може приймати аргументи, які використовуються в коді функції.
  • Функція може повертати значення, яке може бути використано в коді, де функція була викликана.

Створення фукнцій у R відбувається з використанням ключового слова function, а синтаксис має вигляд:

my_func <- function() {
  print("this is my first function")
}

my_func()
[1] "this is my first function"

У рядках 1-3 створюється функція my_func, яка не приймає аргументів, але виконує дію виводу тексту "this is my first function" на екран. У рядку 5 функція викликається.

Увага. Виконання функції відбувається у момент виклику, а не у момент створення.

У прикладі вище my_func є імям функції, а my_func() - її виликом.

13.2 Передача аргументів та повернення значень

Функції також можуть приймати аргументи. Ви можете додати стільки аргументів, скільки вам потрібно, розділяючи їх комами.

Наприклад, створимо функцію для конвретації валюти з гривні у долари:

uah_to_usd <- function(uah) {
  usd_rate <- 40
  usd_amount <- uah / usd_rate
  print(usd_amount)
}

uah_to_usd(200)
[1] 5

У прикладі вище ми вивели значення прямо з функції, проте частіше виникає потреба повернути значення з функції, щоб використати його далі. Для цього використовується ключове слово return. Перепишемо нашу функцію:

uah_to_usd <- function(uah) {
  usd_rate <- 40
  usd_amount <- uah / usd_rate
  return(usd_amount)
}

total_usd <- uah_to_usd(200)
print(paste("Total USD:", total_usd))
[1] "Total USD: 5"

Насправді у R можна не використовувати return, а просто використовувати останнє значення, яке буде обчислено в функції. Однак, це не є хорошою практикою, оскільки це може призвести до помилок, які важко знайти у коді програми:

uah_to_usd <- function(uah) {
  usd_rate <- 40
  usd_amount <- uah / usd_rate
  return(usd_amount)
}

13.3 Аргументи функції за замовчуванням

Розширимо нашу попереню функцію та будемо також передавати курс USD/UAH як параметр. Якщо курс не передано, то використовуємо курс за замовчуванням:

uah_to_usd <- function(uah, usd_rate = 40) {
  usd_amount <- uah / usd_rate
  return(usd_amount)
}

# Буде використано курс за замовчуванням
uah_to_usd(200)
[1] 5
# Буде використано курс 42.5
uah_to_usd(200, 42.5)
[1] 4.705882

Приклади розв’язання завдань

Завдання 1. Середнє значення

Напишіть функцію, що обчислює середнє значення чисел у векторі та повертає його. Точність обчислень - \(2\) знаки після коми.

Примітка. Під час розвязання задачі не можна користуватися жодними готовими вбудованими функціямию

Розв’язання

average <- function(x) {
  count <- 0
  sum <- 0
  for(i in x) {
    count <- count + 1
    sum <- sum + i
  }
  return(round(sum/count, 2))
}

vector <- c(5, 2, 7, 9, 2, 1)

average(vector)
[1] 4.33

Завдання 2. Створення вектору із випадковими числами

Написати функцію, що генерує вектор випадкових чисел у вказаному діапазоні. Якщо діапазон користувачем не вказано, то генеруються значення у діапазоні від \(0\) до \(100\). Також варто врахувати, що випадкові числа можуть мати дробову частину. У такому випадку потрібно передати

Розв’язання

randomNumbers <- function(n, min = 0, max = 100, intOnly = TRUE) {
  if(intOnly) {
    return(sample(min:max, n, replace = TRUE))
  } else {
    return(runif(n, min, max))
  }
}

randomNumbers(10, intOnly = F)
 [1] 80.908700 31.384017 91.524648 61.497971 95.721116 76.085918 45.533927
 [8]  2.446864 45.324329 14.984744
randomNumbers(10, 100, 200)
 [1] 100 110 131 144 161 158 200 127 128 183

Завдання 3. Депозитний калькулятор

Напишіть функцію, що обчислює суму депозиту на кінець терміну вкладу. Функція повинна приймати наступні аргументи:

  • P - сума депозиту у гривні.
  • n - термін депозиту у місяцях.
  • r - щомісячна відсоткова ставка за депозитом
  • monthly capitaliztion

During caluculations print every month info in style: “Month: 1 / Total: 1010 / 10 EUR” Suppose I deposit 1000 (P) dollars in bank every month for 60 (n) months and bank pays me 1 (rate) percent per month as interest. Hence I can calculate the interest on each deposit as:

\(A = P*(1+\frac{r}{n})^n\)

The formula used is A = P(1+r/n) ^ n, where ‘A’ represents final amount procured, ‘P’ represents principal, ‘r’ represents annual interest rate, ‘n’ represents the number of times that interest has been compounded, ‘t’ represents the tenure.