Перейти к основному содержимому
Модуль 3 · Урок 1 из 25/10 в курсе~12 min
Уроки модуля (1/2)

Написание функций

В R функции являются первоклассными гражданами (самостоятельными объектами) и позволяют структурировать код в модульные, повторно используемые и хорошо организованные блоки.

Определение функции

Чтобы определить функцию, используйте ключевое слово function и присвойте созданный объект переменной (имени функции) с помощью оператора присваивания <-:

R
# Simple function definition
greet_user <- function() {
  print("Hello, User!")
}

# Invoking the function
greet_user()

Параметры и возвращаемые значения

Функции могут принимать один или несколько параметров. Чтобы явно вернуть значение, используйте функцию return(). Если return() опущен, R автоматически вернет значение последнего вычисленного выражения в теле функции.

R
# Function that adds two numbers and returns the result
add_numbers <- function(a, b) {
  sum_result <- a + b
  return(sum_result)
}

total <- add_numbers(5, 7)
print(total) # Prints 12

Аргументы по умолчанию

Вы можете указать значения по умолчанию для параметров функции. Если аргумент не указан при вызове функции, R будет использовать значение по умолчанию:

R
# The function uses a default discount rate of 10% (0.10)
apply_discount <- function(price, discount = 0.10) {
  discounted_price <- price * (1 - discount)
  return(discounted_price)
}

# Uses the default (10%)
print(apply_discount(100)) # Prints 90

# Specifies a custom discount (20%)
print(apply_discount(100, 0.20)) # Prints 80

Возврат нескольких значений с помощью списков

Поскольку функция в R может возвращать только один объект напрямую через return(), если нам нужно вернуть несколько значений (возможно, разных типов или длин), мы можем объединить их в список (list):

R
get_stats <- function(v) {
  stats <- list(
    mean_val = mean(v),
    max_val = max(v)
  )
  return(stats)
}

results <- get_stats(c(10, 20, 30))
print(results$mean_val) # Prints 20

Анонимные функции и sapply

Анонимные функции (функции без встроенного имени) чрезвычайно полезны в сочетании с такими функциями, как sapply(), для применения быстрых преобразований к элементам вектора или списка.

В современном R (начиная с версии 4.1.0) вы можете определять анонимные функции, используя сокращенный синтаксис \(x) в дополнение к классическому function(x):

R
v <- c(1, 2, 3)

# Using sapply with a classic anonymous function
sapply(v, function(x) x^2) # 1 4 9

# Using sapply with shorthand syntax (R >= 4.1.0)
sapply(v, \(x) x^2) # 1 4 9

Попробуйте сами

Упражнение#r.m3.l1.e1
Попыток: 0Загрузка…

Определите функцию с именем double_value, которая принимает один аргумент x и возвращает его двойное значение (x * 2) с помощью return().

Загрузка редактора…
Показать подсказку

Используйте синтаксис: double_value <- function(x) { return(x * 2) }

Решение доступно после 3 попыток

Упражнение#r.m3.l1.e2
Попыток: 0Загрузка…

Определите функцию с именем Calculation_area, которая принимает два аргумента: ширину и высоту. Функция должна вернуть свой продукт с помощью return().

Загрузка редактора…
Показать подсказку

Определите функцию с параметрами width и height и верните ширину * высоту.

Решение доступно после 3 попыток

Упражнение#r.m3.l1.e3
Попыток: 0Загрузка…

Определите функцию с именем Calculate_tax, которая принимает обязательную сумму аргумента и необязательную ставку аргумента со значением по умолчанию 0,22. Возврат суммы товара * ставка.

Загрузка редактора…
Показать подсказку

США: Calculate_tax <- функция (сумма, ставка = 0,22) { return (сумма * ставка) }

Решение доступно после 3 попыток

Упражнение#r.m3.l1.e4
Попыток: 0Загрузка…

Определите функцию с именем Analysis_vector, которая принимает вектор v. Функция должна возвращать список, содержащий два элемента с именем sum (сумма вектора, рассчитанная с помощью sum(v)) и len (длина вектора, рассчитанная с помощью length(v)).

Загрузка редактора…
Показать подсказку

Используйте синтаксис: Analysis_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }

Решение доступно после 3 попыток

Упражнение#r.m3.l1.e5
Попыток: 0Загрузка…

Учитывая вектор v, используйте функцию sapply() с анонимной функцией, чтобы утроить значение каждого элемента (умножив его на 3). Сохраните результат в переменной тройной.

Загрузка редактора…
Показать подсказку

Использование: утроенный <- sapply(v, function(x) x * 3)

Решение доступно после 3 попыток