Простые приложения на R
Простые приложения на R
В экосистеме R под "приложением" чаще всего понимают скрипт или проект, который решает одну аналитическую задачу — загрузить таблицу, посчитать метрики, построить график, сохранить отчёт или отдать результат коллеге. Полноценный веб-интерфейс на Shiny — следующий уровень; здесь — базовые сценарии, с которых удобно начать после первой программы.
Типичный контекст — CSV или Excel с продажами, опрос, логи эксперимента. R хорошо подходит, когда нужны готовые статистические функции и воспроизводимость шагов — см. основы языка, типы и векторизацию, функции и пакеты. Общая модель табличных данных в энциклопедии — в разделе данные и разметка; сравнение с Python для ETL — в основных языках.
Как запускать примеры из главы
| Способ | Когда удобно |
|---|---|
Rscript имя.R | CI, 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 как основа веб-интеграций.