Перейти к основному содержимому

Простые приложения на R

Разработчику Архитектору

Простые приложения на R

В экосистеме R под "приложением" чаще всего понимают скрипт или проект, который решает одну аналитическую задачу — загрузить таблицу, посчитать метрики, построить график, сохранить отчёт или отдать результат коллеге. Полноценный веб-интерфейс на Shiny — следующий уровень; здесь — базовые сценарии, с которых удобно начать после первой программы.

Типичный контекст — CSV или Excel с продажами, опрос, логи эксперимента. R хорошо подходит, когда нужны готовые статистические функции и воспроизводимость шагов — см. основы языка, типы и векторизацию, функции и пакеты. Общая модель табличных данных в энциклопедии — в разделе данные и разметка; сравнение с Python для ETL — в основных языках.


Как запускать примеры из главы

СпособКогда удобно
Rscript имя.RCI, cron, разовый запуск из терминала
REPL: source("имя.R")отладка по шагам
RStudio / Posit: Sourceинтерактив и проекты

Перед первым запуском проверьте установку: R --version. Пакеты из примеров (dplyr, ggplot2, jsonlite) один раз ставят в сессии:

install.packages(c("dplyr", "ggplot2", "jsonlite"))

В переносимых проектах версии фиксируют через renv — подробнее в архитектуре аналитических приложений.


Чтение CSV и сводка

Подготовка данных

Создайте рядом со скриптом файл sales.csv (или подставьте свой путь). Минимальный пример:

date,region,amount
2025-01-01,North,120
2025-01-02,South,85
2025-01-03,North,200

Как запустить

  • Файл: summary.R, рядом sales.csv
  • Команда: Rscript summary.R
  • Результат: summary() по столбцам и среднее amount в консоли
df <- read.csv("sales.csv", stringsAsFactors = FALSE)
str(df) # типы столбцов после загрузки
summary(df)
cat("Средняя сумма:", mean(df$amount, na.rm = TRUE), "\n")

stringsAsFactors = FALSE — современное поведение: текстовые столбцы остаются character, а не превращаются в факторы без явного решения (см. факторы). Пропуски в amount не ломают среднее благодаря na.rm = TRUE — та же идея, что в управляющих конструкциях при проверке is.na().

Для больших файлов и строгих типов чаще берут readr (read_csv()); для Excel — readxl. Импорт из БД — через DBI и драйвер СУБД, без полной загрузки таблицы в память, если это критично.


Фильтрация и агрегация (dplyr)

Пакет dplyr из tidyverse выражает преобразования цепочкой "глаголами": filter, group_by, summarise. Оператор |> (R 4.1+) или %>% читается сверху вниз — как конвейер шагов.

library(dplyr)

df %>%
filter(amount > 0) %>%
group_by(region) %>%
summarise(
total = sum(amount, na.rm = TRUE),
n = n(),
avg = mean(amount, na.rm = TRUE),
.groups = "drop"
)

Здесь filter отсекает нулевые и отрицательные суммы, group_by(region) задаёт группы для агрегатов, summarise считает итоги по каждому региону. Аргумент .groups = "drop" убирает лишнюю группировку в результате — рекомендуемая практика в новых версиях dplyr.

Тот же смысл без пайплайна можно выразить базовым R (aggregate, подмножества по [), но цепочки проще сопровождать в отчётах Quarto / R Markdown.


Простой график (ggplot2)

ggplot2 строит график слоями: данные → эстетики (aes) → геометрия (geom_*) → тема. Это удобно, когда один и тот же набор нужно визуализировать разными способами без переписывания всего скрипта.

library(ggplot2)

p <- ggplot(df, aes(x = as.Date(date), y = amount, color = region)) +
geom_line() +
geom_point(size = 2) +
labs(title = "Продажи по дням", x = "Дата", y = "Сумма") +
theme_minimal()

print(p)
ggsave("report.png", plot = p, width = 8, height = 4, dpi = 150)

Файл report.png появится в рабочей директории (getwd()). Для отчёта в PDF/HTML график вставляют в Quarto- или Rmd-документ — тогда код, таблица и текст обновляются одной командой рендера.


Сохранение JSON (jsonlite)

Структурированный обмен с другими сервисами (в том числе с Python через REST) удобно делать в JSON. Пакет jsonlite сериализует списки R в JSON и обратно.

library(jsonlite)

tasks <- list(
list(id = 1, title = "Изучить R", done = FALSE),
list(id = 2, title = "Построить график", done = TRUE)
)
write_json(tasks, "tasks.json", pretty = TRUE, auto_unbox = TRUE)

# чтение обратно
restored <- read_json("tasks.json", simplifyVector = FALSE)

auto_unbox = TRUE записывает одиночные логические и числовые значения без лишних массивов длины 1 — файл проще читать глазами и парсить с другой стороны.


Случайная выборка (мини-"генератор")

Небольшая пользовательская функция показывает, как в R собирают утилиты:

  • вектор символов;
  • sample;
  • paste.
sample_password <- function(n = 16) {
chars <- c(letters, LETTERS, 0:9)
paste(sample(chars, n, replace = TRUE), collapse = "")
}
set.seed(42) # воспроизводимость — см. основы
cat(sample_password(), "\n")

Для криптостойких паролей в продакшене используют специализированные средства ОС или пакеты с CSPRNG; для учебного примера достаточно sample.


Набор tips (маршрут Excel → R)

После EDA в Excel тот же анализ удобно повторить в R на кадре tips (чаевые в ресторане). Данные можно взять из CSV или из пакета reshape2 (data("tips", package = "reshape2")).

library(dplyr)
library(ggplot2)

tips <- read.csv("tips.csv", stringsAsFactors = FALSE)

Файл tips.csv проще всего получить из Python: sns.load_dataset("tips").to_csv("tips.csv", index=False) — см. Python для анализа данных. Общий маршрут по инструментам — Маршрут Excel → R → Python.

tips %>%
filter(total_bill > 10) %>%
group_by(time) %>%
summarise(
n = n(),
avg_tip = mean(tip, na.rm = TRUE),
.groups = "drop"
)

ggplot(tips, aes(x = time, y = tip)) +
geom_boxplot() +
labs(title = "Чаевые по времени приёма") +
theme_minimal()

Проверка гипотез и модель на том же наборе:

t.test(tip ~ time, data = tips)
lm(tip ~ total_bill + time, data = tips)

Теория — основы статистики, регрессия в трёх средах — Линейная регрессия — Excel, R и Python.


Характерный пример — векторы вместо циклов

В R операции над целым вектором выполняются на уровне движка — быстрее и короче, чем явный for по индексам (подробнее в типах и векторизации).

x <- c(10, 20, 30, NA, 50)
y <- x * 2
y[is.na(x)] <- 0 # заменить пропуски перед расчётом
print(y)
# 20 40 60 0 100

Логическая индексация y[is.na(x)] — типичный приём очистки данных перед mean, lm или экспортом. Циклы оставляют для последовательных моделей (Монте-Карло, обучение по эпохам) — см. циклы в коде.


Мини-отчёт в один файл (Quarto, набросок)

Следующий шаг после скрипта — документ, где код и вывод связаны. В проекте с Quarto файл report.qmd может содержать блок R с тем же df и ggplot2; рендер даёт HTML или PDF. Связь с воспроизводимостью и renv — в архитектуре и истории экосистемы (R Markdown, Quarto).


Что изучить дальше

ЗадачаМатериал
Интерактивный дашбордShiny — история R, архитектура
Статистические моделиlm, glmосновы
Пайплайн с кэшем шаговtargetsархитектура
HTTP API из Rпакет plumberинтеграции

См. также: Julia — простые приложения · Python при сравнении стеков анализа данных.

Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.