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


Достаточно часто встречается ситуация, когда размер и содержание отчетной формы будет зависеть от состава переданных на вход данных. Речь идет именно о story-telling отчете, а не о простом выводе таблицы. В этом случае, в зависимости от содержания входных данных, могут появляться или исчезать отдельные пункты, графики, таблицы, текст.


Что будет делать классический Excel-Word аналитик? Под каждый новый запрос делать кастомный отчет и сохранять его в отдельный файл. Но можно заглянуть немного под капот и заставить компьютер делать все самостоятельно.


R Markdown позволяет все это выполнить в элегантной форме. Некоторые технические детали ниже.


Основная идея


У нас есть данные, содержание которых может меняться. Например, надо строить отчет по машинам, развозящим грузы (пример абстрактный). Количество и номера машин, выходящих в рейс, каждый день разные, но сводка по каждой машине по своей структуре одинакова. Будем отталкиваться от этого.


R Markdown выполняется в несколько проходов. При этом из Rmd сначала формируется .md, а потом из него формируется выходное представление, наиболее популярным является html формат.


Итого, намечаются 2 варианта.


  1. Можно на этапе компиляции отчета вставить в компилируемый .Rmd нужные блоки (собранные или шаблонизированные).
  2. Можно на этапе компиляции отчета вставить в промежуточный .md нужные markdown вставки.

Реализация


Ниже просто пример кода, который каждый желающий может запустить у себя на машине. Он охватывает реализации обоих примеров и минимален, чтобы передать суть.


  1. Динамически вставляем гиперссылки, получаемые из внешнего источника.
  2. Динамически формируем разделы документов на основании данных.

Исходный код и Результирующий отчет


Ссылки


Вот ещё полезная информация на эту тему:



P.S. Для сомневающихся этот пример является неплохой аргументацией, почему имеет смысл посмотреть в сторону R.


Предыдущая публикация — «Медианы выборок. Доверительные интервалы и сравнение».