Уроки модуля (1/2)
Написание функций
В R функции являются первоклассными гражданами (самостоятельными объектами) и позволяют структурировать код в модульные, повторно используемые и хорошо организованные блоки.
Определение функции
Чтобы определить функцию, используйте ключевое слово function и присвойте созданный объект переменной (имени функции) с помощью оператора присваивания <-:
# Simple function definition
greet_user <- function() {
print("Hello, User!")
}
# Invoking the function
greet_user()Параметры и возвращаемые значения
Функции могут принимать один или несколько параметров. Чтобы явно вернуть значение, используйте функцию return(). Если return() опущен, 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 будет использовать значение по умолчанию:
# 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):
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):
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Попробуйте сами
Определите функцию с именем double_value, которая принимает один аргумент x и возвращает его двойное значение (x * 2) с помощью return().
Показать подсказку
Используйте синтаксис: double_value <- function(x) { return(x * 2) }
Решение доступно после 3 попыток
Определите функцию с именем Calculation_area, которая принимает два аргумента: ширину и высоту. Функция должна вернуть свой продукт с помощью return().
Показать подсказку
Определите функцию с параметрами width и height и верните ширину * высоту.
Решение доступно после 3 попыток
Определите функцию с именем Calculate_tax, которая принимает обязательную сумму аргумента и необязательную ставку аргумента со значением по умолчанию 0,22. Возврат суммы товара * ставка.
Показать подсказку
США: Calculate_tax <- функция (сумма, ставка = 0,22) { return (сумма * ставка) }
Решение доступно после 3 попыток
Определите функцию с именем Analysis_vector, которая принимает вектор v. Функция должна возвращать список, содержащий два элемента с именем sum (сумма вектора, рассчитанная с помощью sum(v)) и len (длина вектора, рассчитанная с помощью length(v)).
Показать подсказку
Используйте синтаксис: Analysis_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }
Решение доступно после 3 попыток
Учитывая вектор v, используйте функцию sapply() с анонимной функцией, чтобы утроить значение каждого элемента (умножив его на 3). Сохраните результат в переменной тройной.
Показать подсказку
Использование: утроенный <- sapply(v, function(x) x * 3)
Решение доступно после 3 попыток