Анализ данных в R

Основы функционального программирования

Д.А. Омельченко

ИГН АлтГУ

Что такое функциональное программирование?

Базовое определение

Функциональное программирование -— это парадигма программирования, в которой основным строительным блоком являются функции.

  • Преимущества:
    • функция всегда возвращает один и тот же результат при одинаковых входных данных
    • не имеет побочных эффектов (не меняет «внешнее состояние»)
    • данные считаются неизменяемыми — вместо модификации создаются новые объекты

Tip

В ФП программа описывается как цепочка преобразований данных через функции (например, select, filter, summarize), а не как последовательность команд, изменяющих переменные. Это делает код более предсказуемым, тестируемым и удобным для автоматизации и параллельной обработки.

Зачем ФП нужно социальным исследователям?

  • Осознанность и аккуратность в работе с данными
  • Автоматизация рутинных задач социологического анализа
  • Чище и надежнее код, меньше ошибок в результатах и выводах
  • Подготовка к продвинутым инструментам и междисциплинарным проектам
  • Развитие абстрактного и логического мышления

Понятие функции

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

Это часть программного кода, который может быть вызван сам по себе или в других частях программы.

В R функция создается очень просто - с помощью ключевого слова function. Базовый синтаксис у функции следующий:

function_name <- function(arg_1, arg_2, ...) {
   Function body 
}

Основные элементы функции

У функции есть несколько частей:

  • Function Name (имя функции)
function_name <- function(arg_1, arg_2, ...) {
   Function body 
}
  • Arguments (аргументы)
function_name <- function(arg_1, arg_2, ...) {
   Function body 
}
  • Function Body (тело функции)
function_name <- function(arg_1, arg_2, ...) {
   Function body 
}
  • Return Value (возвращаемое значение)
sum_2_numbers <- function(x, y) {
  x + y 
}

sum_2_numbers(48, 74)
[1] 122

Встроенные функции

В R есть много базовых функций, таких как mean(), max(), sum(x) и др. Они вызываются напрямую при написании программы.

# Найти среднее чисел от 25 до 82.
mean(25:82)
[1] 53.5
# Найти сумму чисел от 41 до 68.
sum(41:68)
[1] 1526

Пользовательские функции

Предположим, нам нужна функция, которая бы возводила в квадрат какое-то число:

square<- function(a) {
   return(a^2)
}   
square(6)
[1] 36

Вызов функции без аргумента

Рассмотрим еще один пример:

# Создаем функцию без аргумента
seq_squared <- function() {
  seq<-1:5
  return(seq^2)
}   

seq_squared()
[1]  1  4  9 16 25

Создание функции с аргументами, различающимися по позиции и именам

Аргументы функции могут предоставляться в той же последовательности, в которой они написаны в функции, без указания имен, или в другой последовательности, но с обязательным указанием имени.

# Создаем функцию с аргументами.
fun_with_args <- function(a,b,c) {
   result <- a * b + c
   print(result)
}

# Вызываем функцию, перечисляя аргументы по порядку.
fun_with_args(5,3,11)
[1] 26
# Вызываем фунцию, называя аргументы поименно.
fun_with_args(a = 11, b = 5, c = 3)
[1] 58

Создание функции с аргументами по умолчанию

Мы можем определить значение аргумента функции в ходе ее определения и запустить функцию без дополнительного назначения аргументов.

В этом случае мы получим некоторый результат по умолчанию. Но мы можем изменить эти исходные значения, и получить новый результат.

Простой пример такой функции:

# Создаем новую функцию с аргументами.
func_with_agrs <- function(a = 3, b = 6) {
   result <- a * b
   print(result)
}

# Запускаем функцию без аргументов в скобках.
func_with_agrs()
[1] 18
# Вызываем функцию с новыми значениями аргументов.
func_with_agrs(9,5)
[1] 45

“Ленивая” (Lazy) обработка аргументов функции

“Ленивая загрузка”, “ленивая обработка” что означает, что аргументы функции вызываются и обрабатываются только в определенный момент времени, когда это требуется.

# Создаем функцию с двумя аргументами.
function_lazy <- function(a, b) {
   print(a^2)
   print(a)
   print(b)
}

# Пробуем применить функцию только с одним аргументом.
function_lazy(6)
[1] 36
[1] 6
Error in `function_lazy()`:
! аргумент "b" пропущен, умолчаний нет

Подведем итоги

  • Создавать функции может каждый, нужно только следовать определенным правилам
  • Пользовательские функции могут существенно упростить жизнь аналитика
  • Если какие-то действия совершаются регулярно и требуют повторения одних и тех же строчек кода - стоит задуматься о создании функции
  • Чтобы научиться писать функции, нужно практиковаться!