<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Максим Олифиренко</title><author><name>Максим Олифиренко</name></author><id>https://teletype.in/atom/putenchik</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/putenchik?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@putenchik?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=putenchik"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/putenchik?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-07-26T12:59:53.095Z</updated><entry><id>putenchik:RMcr2tLkcLV</id><link rel="alternate" type="text/html" href="https://teletype.in/@putenchik/RMcr2tLkcLV?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=putenchik"></link><title>Визуализации при помощи Shiny</title><published>2025-05-11T11:03:26.966Z</published><updated>2025-05-17T06:32:31.434Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/80/ad/80ad662b-10e4-441c-a0d3-77c3bf06769e.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/e8/d0/e8d06b1b-0884-47af-a25d-8b6f820b69aa.png&quot;&gt;Shiny - это R-пакет, который позволяет создавать интерактивные веб-приложения непосредственно из R. Это мощный инструмент для визуализации данных, анализа и обмена результатами с широкой аудиторией.</summary><content type="html">
  &lt;h2 id=&quot;oNXo&quot;&gt;Оглавление&lt;/h2&gt;
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#oNXo&quot;&gt;Оглавление&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#PQTH&quot;&gt;Основная информация о Shiny&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#iHxM&quot;&gt;Документация&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#K5iF&quot;&gt;Основные компоненты Shiny&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#GILo&quot;&gt;Применение Shiny&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#XWqa&quot;&gt;Установка Shiny&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#eHBv&quot;&gt;Использование на R&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#Gfuv&quot;&gt;Использование на Python&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#Cwk1&quot;&gt;Онлайн редактор&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#x0z9&quot;&gt;Элементы приложения Shiny&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#xUGl&quot;&gt;UI&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#2V88&quot;&gt;Server&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#pjTU&quot;&gt;Пример на датасете &quot;Породы собак&quot;&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#smt5&quot;&gt;Объяснение примера&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#72D4&quot;&gt;Развёртывание на shinyapps.io&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#vPKe&quot;&gt;Подведение итогов&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#3dxR&quot;&gt;Преимущества&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#ZgMm&quot;&gt;Недостатки&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;h2 id=&quot;PQTH&quot;&gt;Основная информация о Shiny&lt;/h2&gt;
  &lt;p id=&quot;0ysZ&quot;&gt;Shiny — это веб-фреймворк для разработки веб-приложений, изначально на R, а с 2022 года на Python. Это мощный инструмент для визуализации данных, анализа и обмена результатами с широкой аудиторией.&lt;/p&gt;
  &lt;h3 id=&quot;iHxM&quot;&gt;Документация&lt;/h3&gt;
  &lt;ul id=&quot;IGM0&quot;&gt;
    &lt;li id=&quot;kovr&quot;&gt;&lt;a href=&quot;https://shiny.posit.co&quot; target=&quot;_blank&quot;&gt;Официальный сайт&lt;/a&gt; проекта;&lt;/li&gt;
    &lt;li id=&quot;EnVR&quot;&gt;Быстрый старт на &lt;a href=&quot;https://shiny.posit.co/r/getstarted/shiny-basics/lesson1/&quot; target=&quot;_blank&quot;&gt;языке R&lt;/a&gt;;&lt;/li&gt;
    &lt;li id=&quot;9fMd&quot;&gt;Быстрый старт на &lt;a href=&quot;https://shiny.posit.co/py/docs/overview.html&quot; target=&quot;_blank&quot;&gt;Python&lt;/a&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;K5iF&quot;&gt;Основные компоненты Shiny&lt;/h3&gt;
  &lt;ul id=&quot;s9CC&quot;&gt;
    &lt;li id=&quot;X8yq&quot;&gt;&lt;strong&gt;Реактивность&lt;/strong&gt;.Когда пользователь изменяет элемент управления (например, слайдер, поле ввода), Shiny автоматически пересчитывает результаты и обновляет выходные данные (например, графики, таблицы). Это создает отзывчивый и динамичный пользовательский интерфейс.&lt;/li&gt;
    &lt;li id=&quot;MF55&quot;&gt;&lt;strong&gt;UI (User Interface)&lt;/strong&gt;. Определяет визуальную структуру приложения. Он включает в себя элементы управления (виджеты) для ввода данных и элементы для отображения выходных данных, которые и обеспечивают реактивность запускаемых приложений.&lt;/li&gt;
    &lt;li id=&quot;7aMX&quot;&gt;&lt;strong&gt;Server&lt;/strong&gt;. Содержит логику приложения. Здесь происходит вся тяжелая работа: обработка данных, выполнение расчетов, создание графиков и таблиц.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;GILo&quot;&gt;Применение Shiny&lt;/h3&gt;
  &lt;ul id=&quot;Whhm&quot;&gt;
    &lt;li id=&quot;eBjN&quot;&gt;&lt;strong&gt;Визуализация данных и дашборды&lt;/strong&gt;. Создание интерактивных дашбордов для отслеживания ключевых показателей, визуализации трендов и предоставления информации.&lt;/li&gt;
    &lt;li id=&quot;6CDE&quot;&gt;&lt;strong&gt;Интерактивный анализ данных&lt;/strong&gt;. Позволяет пользователям проводить анализ данных, экспериментировать с параметрами и видеть результаты в реальном времени.&lt;/li&gt;
    &lt;li id=&quot;5idz&quot;&gt;&lt;strong&gt;Образование и обучение&lt;/strong&gt;. Создание интерактивных инструментов для обучения статистике, программированию и другим темам.&lt;/li&gt;
    &lt;li id=&quot;pirk&quot;&gt;&lt;strong&gt;Разработка веб-приложений&lt;/strong&gt;. Создание веб-приложений для анализа данных, моделирования и принятия решений.&lt;/li&gt;
    &lt;li id=&quot;gssS&quot;&gt;&lt;strong&gt;Научные исследования&lt;/strong&gt;. Позволяет ученым делиться своими исследованиями и результатами с коллегами и широкой аудиторией в интерактивном формате.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;XWqa&quot;&gt;Установка Shiny&lt;/h2&gt;
  &lt;h3 id=&quot;eHBv&quot;&gt;Использование на R&lt;/h3&gt;
  &lt;p id=&quot;tVqC&quot;&gt;Перейти по ссылке и скачать установщик языка R: &lt;a href=&quot;https://cran.rstudio.com/bin/windows/base/&quot; target=&quot;_blank&quot;&gt;https://cran.rstudio.com/bin/windows/base/&lt;/a&gt;. После запуска установщика можно выбрать предпочитаемый язык и корневую директорию языка, после чего установить его.&lt;/p&gt;
  &lt;p id=&quot;Spq6&quot;&gt;Со станицы установки RStudio скачать его установщик:&lt;br /&gt;&lt;a href=&quot;https://posit.co/download/rstudio-desktop/&quot; target=&quot;_blank&quot;&gt;https://posit.co/download/rstudio-desktop/&lt;/a&gt;. После его загрузки также можно выбрать корневую директорию утилиты.&lt;/p&gt;
  &lt;p id=&quot;LlIG&quot;&gt;Установка Shiny возможна либо через консоль, либо с помощью интерфейса среды. В первом случае необходимо открыть консоль (Console) и установить пакет:&lt;/p&gt;
  &lt;pre id=&quot;6jpw&quot; data-lang=&quot;r&quot;&gt;install.packages(&amp;quot;shiny&amp;quot;)&lt;/pre&gt;
  &lt;p id=&quot;4HMV&quot;&gt;Второй способ: при указании библиотеки Shiny в коде приложения RStudio сам предложит установить необходимые зависимости.&lt;/p&gt;
  &lt;h3 id=&quot;Gfuv&quot;&gt;Использование на Python&lt;/h3&gt;
  &lt;pre id=&quot;vOCC&quot; data-lang=&quot;bash&quot;&gt;pip install --upgrade pip wheel           # обновление утановщика пакетов&lt;/pre&gt;
  &lt;pre id=&quot;nERA&quot; data-lang=&quot;bash&quot;&gt;pip install shiny                         # установка библиотеки&lt;/pre&gt;
  &lt;pre id=&quot;Q8cZ&quot; data-lang=&quot;bash&quot;&gt;pip install --upgrade shiny htmltools     # или её обновление&lt;/pre&gt;
  &lt;h3 id=&quot;Cwk1&quot;&gt;Онлайн редактор&lt;/h3&gt;
  &lt;p id=&quot;00pM&quot;&gt;Помимо локальной разработки своих приложений Shiny имеет официальный &lt;a href=&quot;https://shinylive.io/r/editor/&quot; target=&quot;_blank&quot;&gt;онлайн редактор&lt;/a&gt;, который позволяет писать код приложения Shiny на R прямо в браузере и наблюдать изменения в реальном времени.&lt;/p&gt;
  &lt;figure id=&quot;LpfP&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fa/ee/faee0974-8123-47d0-8a4b-ad76b688ea2a.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Исходный пример в онлайн редакторе Shiny&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;x0z9&quot;&gt;Элементы приложения Shiny&lt;/h2&gt;
  &lt;p id=&quot;2p9C&quot;&gt;После установки всех инструментов становится возможным создание визуализаций на Shiny. Для использования библиотеки в файле с расширением &lt;code&gt;.R&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;vKx9&quot; data-lang=&quot;r&quot;&gt;library(shiny)&lt;/pre&gt;
  &lt;p id=&quot;ej5v&quot;&gt;Приложение Shiny создаётся вызовом функции &lt;code&gt;shinyApp&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;3wsm&quot; data-lang=&quot;r&quot;&gt;shinyApp(ui = ui, server = server)&lt;/pre&gt;
  &lt;p id=&quot;2s7u&quot;&gt;В ней указываются 2 основных элемента:&lt;/p&gt;
  &lt;ul id=&quot;N1qm&quot;&gt;
    &lt;li id=&quot;jdIO&quot;&gt;&lt;code&gt;ui&lt;/code&gt; - пользовательский интерфейс, определяющий инструменты ввода данных и параметров, вывода текста или визуализаций, фильтры. Все эти функции генерируют HTML-разметку.&lt;/li&gt;
    &lt;li id=&quot;2hJQ&quot;&gt;&lt;code&gt;server&lt;/code&gt; - логика приложения, обрабатывающая передаваемые интерфейсом данные и производящая рендер графиков.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;xUGl&quot;&gt;UI&lt;/h3&gt;
  &lt;p id=&quot;R9MX&quot;&gt;Разметку макета можно задавать несколькими функциями, которые будут задавать вёрстку и расположение её дочерних элементов. Вот основные из них:&lt;/p&gt;
  &lt;ul id=&quot;Qbhe&quot;&gt;
    &lt;li id=&quot;kXF3&quot;&gt;&lt;code&gt;fluidPage&lt;/code&gt;: создает макет, который масштабируется в зависимости от размера окна браузера. Рекомендуется для большинства приложений. Он использует систему сеток Bootstrap.&lt;/li&gt;
    &lt;li id=&quot;gLyO&quot;&gt;&lt;code&gt;fixedPage&lt;/code&gt;: создает макет фиксированной ширины.&lt;/li&gt;
    &lt;li id=&quot;AAcM&quot;&gt;&lt;code&gt;sidebarLayout&lt;/code&gt;: создает макет с боковой панелью и основной панелью. Принимает два аргумента: &lt;code&gt;sidebarPanel&lt;/code&gt; и &lt;code&gt;mainPanel&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;zUZl&quot;&gt;Другие макеты: &lt;code&gt;fillPage&lt;/code&gt;, &lt;code&gt;splitLayout&lt;/code&gt;, &lt;code&gt;verticalLayout&lt;/code&gt; .&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;IY7a&quot;&gt;Элементы управления ввода (input widgets) позволяют пользователям вводить данные или взаимодействовать с приложением:&lt;/p&gt;
  &lt;ul id=&quot;gzZQ&quot;&gt;
    &lt;li id=&quot;cBV4&quot;&gt;&lt;code&gt;textInput&lt;/code&gt; - текстовое поле для ввода текста.&lt;/li&gt;
    &lt;li id=&quot;jsz2&quot;&gt;&lt;code&gt;numericInput&lt;/code&gt; - числовое поле для ввода чисел.&lt;/li&gt;
    &lt;li id=&quot;cFTP&quot;&gt;&lt;code&gt;sliderInput&lt;/code&gt; - слайдер для выбора числового значения.&lt;/li&gt;
    &lt;li id=&quot;38RF&quot;&gt;&lt;code&gt;selectInput&lt;/code&gt; - выпадающий список для выбора из списка вариантов.&lt;/li&gt;
    &lt;li id=&quot;HRY9&quot;&gt;&lt;code&gt;radioButtons&lt;/code&gt; - радиокнопки для выбора одного варианта из списка.&lt;/li&gt;
    &lt;li id=&quot;d14p&quot;&gt;&lt;code&gt;checkboxGroupInput&lt;/code&gt; - набор флажков для выбора нескольких вариантов из списка.&lt;/li&gt;
    &lt;li id=&quot;zMlI&quot;&gt;&lt;code&gt;checkboxInput&lt;/code&gt; - одиночный флажок (логическое значение).&lt;/li&gt;
    &lt;li id=&quot;CURq&quot;&gt;&lt;code&gt;dateInput&lt;/code&gt; - выбор даты.&lt;/li&gt;
    &lt;li id=&quot;wXaY&quot;&gt;&lt;code&gt;dateRangeInput&lt;/code&gt; - выбор диапазона дат.&lt;/li&gt;
    &lt;li id=&quot;8LwJ&quot;&gt;&lt;code&gt;fileInput&lt;/code&gt; - загрузка файла.&lt;/li&gt;
    &lt;li id=&quot;GkT3&quot;&gt;&lt;code&gt;actionButton&lt;/code&gt; - кнопка.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;kmmT&quot;&gt;Элементы вывода (output elements) отображают результаты в приложении. Связываются с Server через &lt;code&gt;output$&lt;/code&gt; переменную. Примеры:&lt;/p&gt;
  &lt;ul id=&quot;E8rM&quot;&gt;
    &lt;li id=&quot;EZzQ&quot;&gt;&lt;code&gt;plotOutput&lt;/code&gt; - место для отображения графика.&lt;/li&gt;
    &lt;li id=&quot;Mobr&quot;&gt;&lt;code&gt;tableOutput&lt;/code&gt; - место для отображения таблицы.&lt;/li&gt;
    &lt;li id=&quot;c2aE&quot;&gt;&lt;code&gt;dataTableOutput&lt;/code&gt; - место для отображения интерактивной таблицы данных.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;2V88&quot;&gt;Server&lt;/h3&gt;
  &lt;p id=&quot;hEjE&quot;&gt;Server содержит логику приложения. Он получает входные данные от UI (input), выполняет расчеты и рендерит выходные данные для отображения в UI (output). &lt;code&gt;server&lt;/code&gt; в коде - это R-фукнция, имеющая 2 параметра:&lt;/p&gt;
  &lt;pre id=&quot;xP76&quot; data-lang=&quot;r&quot;&gt;server &amp;lt;- function(input, output) {
     // Логика обработки данных
}&lt;/pre&gt;
  &lt;p id=&quot;WRxx&quot;&gt;Функции рендеринга (rendering functions) преобразуют результаты R-кода в формат, который можно отобразить в UI. Они всегда должны быть внутри функции server.&lt;/p&gt;
  &lt;ul id=&quot;zman&quot;&gt;
    &lt;li id=&quot;9U1B&quot;&gt;&lt;code&gt;renderPlot&lt;/code&gt;: рендерит график, созданный с использованием функций plot(), ggplot2 и т.д. Возвращает графический объект.&lt;/li&gt;
    &lt;li id=&quot;VSQJ&quot;&gt;&lt;code&gt;renderTable&lt;/code&gt;: рендерит таблицу данных (например, data.frame). Возвращает таблицу.&lt;/li&gt;
    &lt;li id=&quot;Owrx&quot;&gt;&lt;code&gt;renderDataTable&lt;/code&gt;: рендерит интерактивную таблицу данных с возможностью сортировки, фильтрации и постраничной навигации (требует пакет DT). Возвращает таблицу.&lt;/li&gt;
    &lt;li id=&quot;k3XB&quot;&gt;&lt;code&gt;renderText&lt;/code&gt;: рендерит текстовую строку. Возвращает строку.&lt;/li&gt;
    &lt;li id=&quot;FU3G&quot;&gt;&lt;code&gt;renderPrint&lt;/code&gt;: рендерит вывод R-кода. Возвращает результат, который можно распечатать в консоли.&lt;/li&gt;
    &lt;li id=&quot;Q0Yl&quot;&gt;&lt;code&gt;renderUI&lt;/code&gt;: рендерит UI-элементы. Используется для динамического создания UI. Возвращает HTML-код для элемента UI.&lt;/li&gt;
    &lt;li id=&quot;5QkG&quot;&gt;&lt;code&gt;renderImage&lt;/code&gt;: рендерит изображение. Возвращает список, содержащий информацию об изображении (путь, mime-тип, ширина, высота).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;pjTU&quot;&gt;Пример на датасете &amp;quot;Породы собак&amp;quot;&lt;/h2&gt;
  &lt;p id=&quot;v96r&quot;&gt;Далее будет разобран простой пример приложения Shiny с 2 визуализациями, построенными на датасете &lt;a href=&quot;https://raw.githubusercontent.com/yupest/nti/master/%D0%9D%D0%A2%D0%98-2021/dogs.csv&quot; target=&quot;_blank&quot;&gt;&amp;quot;Породы собак&amp;quot;&lt;/a&gt;, а также развёрнутом в сервисе &lt;a href=&quot;https://www.shinyapps.io&quot; target=&quot;_blank&quot;&gt;shinyapps.io&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;ypbx&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e8/d0/e8d06b1b-0884-47af-a25d-8b6f820b69aa.png&quot; width=&quot;834&quot; /&gt;
    &lt;figcaption&gt;Внешний вид получившегося приложения&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;smt5&quot;&gt;Объяснение примера&lt;/h3&gt;
  &lt;p id=&quot;nVUr&quot;&gt;Сперва, подключаются библиотеки:&lt;/p&gt;
  &lt;pre id=&quot;4l1P&quot; data-lang=&quot;r&quot;&gt;library(shiny)     # Сама Shiny
library(readr)     # Библиотека для чтения датасета из файла CSV&lt;/pre&gt;
  &lt;p id=&quot;Ccdo&quot;&gt;Затем читается датасет из файла, добавляются вычисляемые поля и устанавливаются константы:&lt;/p&gt;
  &lt;pre id=&quot;elxm&quot; data-lang=&quot;r&quot;&gt;dogsData &amp;lt;- read_csv(&amp;quot;dogs.csv&amp;quot;)  # Чтение датасета из файла в той же директории, что и приложение
customFields &amp;lt;- c(&amp;quot;Вес&amp;quot;, &amp;quot;Рост&amp;quot;, &amp;quot;Продолжительность жизни&amp;quot;, &amp;quot;Стоимость&amp;quot;)
for (field in customFields) {
  fieldMin &amp;lt;- paste0(field, &amp;quot; мин&amp;quot;)
  fieldMax &amp;lt;- paste0(field, &amp;quot; макс&amp;quot;)
  dogsData[field] &amp;lt;- (dogsData[fieldMin] + dogsData[fieldMax]) / 2  # Добавление поля из списка customFields как среднее между 2 соответствующими полями
}
dogsData[[&amp;quot;Итоговый рейтинг&amp;quot;]] &amp;lt;- dogsData[[&amp;quot;Рейтинг&amp;quot;]] - dogsData[[&amp;quot;Антирейтинг&amp;quot;]]  # Вычисление поля итогового рейтинга

DOGS_TOP_DEFAULT &amp;lt;- 10&lt;/pre&gt;
  &lt;p id=&quot;Ul6B&quot;&gt;&lt;code&gt;ui&lt;/code&gt; содержит разметку окна, основанную на функции &lt;code&gt;fluidPage&lt;/code&gt;. Здесь задаётся название приложения (&lt;code&gt;titlePanel&lt;/code&gt;), а также две визуализации, каждая из которых состоит из панели ввода (&lt;code&gt;sidebarPanel&lt;/code&gt;) и главной панели с визуализацией (&lt;code&gt;mainPanel&lt;/code&gt;):&lt;/p&gt;
  &lt;pre id=&quot;3zvg&quot; data-lang=&quot;r&quot;&gt;ui &amp;lt;- fluidPage(
  titlePanel(&amp;quot;Породы собак&amp;quot;),
  sidebarLayout(   # Контейнер точечного графика
    sidebarPanel(
      # выпадающие списки с ранее заданными кастомными полями в customFields
      selectInput(&amp;quot;paramX&amp;quot;, &amp;quot;Ось X:&amp;quot;, choices = customFields, selected = customFields[1]),
      selectInput(&amp;quot;paramY&amp;quot;, &amp;quot;Ось Y:&amp;quot;, choices = customFields, selected = customFields[2]),
      selectInput(&amp;quot;paramSize&amp;quot;, &amp;quot;Размер точек:&amp;quot;, choices = customFields, selected = customFields[3]),
    ),
    mainPanel(
      plotOutput(&amp;quot;scatterplot&amp;quot;)  # тег, заменяемый в server на график (plot)
    )
  ),
  sidebarLayout(   # Контейнер столбчатой диаграммы
    sidebarPanel(
      numericInput(&amp;quot;dogsTopCount&amp;quot;, &amp;quot;Сколько пород в топе:&amp;quot;, min = 3, max = 20, value = DOGS_TOP_DEFAULT),  # поле ввода целого числа
    ),
    mainPanel(
      plotOutput(&amp;quot;barplot&amp;quot;)  # такой же тег графика, но с другим id
    )
  )
)&lt;/pre&gt;
  &lt;p id=&quot;QUwt&quot;&gt;Компонент &lt;code&gt;server&lt;/code&gt; задаётся как функция с ссылками на объекты &lt;code&gt;input&lt;/code&gt; и &lt;code&gt;output&lt;/code&gt;. Через &lt;code&gt;input&lt;/code&gt; передаются фильтры и параметры, меняющиеся в разметке &lt;code&gt;ui&lt;/code&gt;, а в &lt;code&gt;output&lt;/code&gt; - ссылки на объекты &lt;code&gt;plotOutput&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;yz49&quot;&gt;В компоненте &lt;code&gt;server&lt;/code&gt; отдельно обрабатываются два &lt;code&gt;plotOutput&lt;/code&gt;. В первой части рисуется точечный график, ось X, ось Y и размер точек которого зависит от выбранных в разметке полей в выпадающих списках:&lt;/p&gt;
  &lt;pre id=&quot;l4Zv&quot; data-lang=&quot;r&quot;&gt;output$scatterplot &amp;lt;- renderPlot({  # Ссылке scatterplot из output присваивается реактивный элемент
    # Далее поле, выбранное для отображения меняюегося размера точек, нормализуется в диапазоне [1; 5]
    size_data &amp;lt;- dogsData[[input$paramSize]]
    min_size &amp;lt;- min(dogsData[[input$paramSize]], na.rm = TRUE)
    max_size &amp;lt;- max(dogsData[[input$paramSize]], na.rm = TRUE)
    cex_values &amp;lt;- (size_data - min_size) / (max_size - min_size) * 4 + 1
    
    # Объявление самого точечного графика
    plot(dogsData[[input$paramX]],   # Испольуются значения по полю input$paramX
         dogsData[[input$paramY]],   # Испольуются значения по полю input$paramY
         xlab = input$paramX, ylab = input$paramY,  # Меняются подписи осей
         cex = cex_values,  # Устанавливаются нормализованные значения размера точек
         pch = 21,          # Фигура точки - заполненная точка
         col = &amp;quot;black&amp;quot;,     # Цвет границы
         bg = &amp;quot;blue&amp;quot;,       # Цвет заполнения
         main = &amp;quot;Диаграмма рассеивания по средним показателям&amp;quot;)  # Название графика
  })&lt;/pre&gt;
  &lt;p id=&quot;x7qv&quot;&gt;Столбчатая диаграмма строится на основе ранее вычисленного поля &lt;code&gt;&amp;quot;Итоговый рейтинг&amp;quot;&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;NJ3S&quot; data-lang=&quot;r&quot;&gt;output$barplot &amp;lt;- renderPlot({
    dogsTopCount &amp;lt;- reactive({     # Переменная, хранящее количество отображаемых пород в топе
      num &amp;lt;- input$dogsTopCount
      if (is.na(num)) {            # Если поле в интерфейсе не заполнено, присваивается значение по умолчанию
        num &amp;lt;- DOGS_TOP_DEFAULT
      }
      return(num)
    })
    
    # Далее данные агрегируются по породе для правильной обработки
    agg_data &amp;lt;- aggregate(dogsData[[&amp;quot;Итоговый рейтинг&amp;quot;]],
                          by = list(Порода = dogsData[[&amp;quot;Порода собак&amp;quot;]]),
                          FUN = mean,
                          na.rm = TRUE)
    names(agg_data) &amp;lt;- c(&amp;quot;Порода&amp;quot;, &amp;quot;СреднийРейтинг&amp;quot;)
    # Берутся только первые dogsTopCount пород
    topDogs &amp;lt;- head(agg_data[order(agg_data$СреднийРейтинг, decreasing = TRUE), ], dogsTopCount())
    topDogs &amp;lt;- topDogs[nrow(topDogs):1, ]
    
    # Изменение отступов графика
    par(mar = c(5, 12, 4, 2) + 0.1)
    
    barplot(topDogs$СреднийРейтинг,          # Значения - рейтинг породы
            names.arg = topDogs$Порода,      # Подписи столбцов
            horiz = TRUE,                    # Горизонтальная ориентация
            xlab = &amp;quot;Итоговый рейтинг&amp;quot;,       # Подпись для оси X
            main = paste0(&amp;quot;Топ-&amp;quot;, dogsTopCount(), &amp;quot; пород&amp;quot;),   # Адаптивное название графика
            col = &amp;quot;blue&amp;quot;,
            border = &amp;quot;black&amp;quot;,
            las = 2)                         # Подписи пород горизонтальны
  })&lt;/pre&gt;
  &lt;p id=&quot;Jtw7&quot;&gt;Запуск приложения:&lt;/p&gt;
  &lt;pre id=&quot;cyvN&quot; data-lang=&quot;r&quot;&gt;shinyApp(ui = ui, server = server)&lt;/pre&gt;
  &lt;h3 id=&quot;72D4&quot;&gt;Развёртывание на shinyapps.io&lt;/h3&gt;
  &lt;p id=&quot;3l1Z&quot;&gt;1. Установить библиотеку в консоли RStudio:&lt;/p&gt;
  &lt;pre id=&quot;r127&quot; data-lang=&quot;r&quot;&gt;install.packages(&amp;quot;rsconnect&amp;quot;)&lt;/pre&gt;
  &lt;p id=&quot;KVmG&quot;&gt;2. Авторизоваться на &lt;a href=&quot;https://www.shinyapps.io&quot; target=&quot;_blank&quot;&gt;shinyapps.io&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;JZ3f&quot;&gt;3. Получить токен: перейти в раздел Account -&amp;gt; Tokens:&lt;/p&gt;
  &lt;figure id=&quot;dajZ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d2/67/d267e7c5-6445-45a4-896e-72ad6484766e.png&quot; width=&quot;974&quot; /&gt;
    &lt;figcaption&gt;Блок с токеном &lt;a href=&quot;https://www.shinyapps.io&quot; target=&quot;_blank&quot;&gt;shinyapps.io&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;OHwm&quot;&gt;4. При нажатии на кнопку &lt;code&gt;Show&lt;/code&gt; можно будет скопировать строку подключения приложения Shiny к учётной записи:&lt;/p&gt;
  &lt;figure id=&quot;8r1o&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/22/6f/226fd4de-1bc0-427a-a0d7-6413e560b6be.png&quot; width=&quot;898&quot; /&gt;
    &lt;figcaption&gt;Строка подключения приложения Shiny к &lt;a href=&quot;https://www.shinyapps.io&quot; target=&quot;_blank&quot;&gt;shinyapps.io&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ccJn&quot;&gt;5. Вставить в консоль RStudio скопированную строку подключения и выполнить.&lt;/p&gt;
  &lt;p id=&quot;NtEq&quot;&gt;6. Развернуть приложение с помощью консольной команды. Укажите полный путь к директории приложения, на Windows также экранируйте символы &lt;code&gt;&amp;#x27;\&amp;#x27;&lt;/code&gt;. В этой директории должен находится &lt;code&gt;app.R&lt;/code&gt; с полным кодом приложения, а также вспомогательный файл (для примера выше это &lt;code&gt;dogs.csv&lt;/code&gt;):&lt;/p&gt;
  &lt;pre id=&quot;DyCa&quot; data-lang=&quot;r&quot;&gt;rsconnect::deployApp(&amp;quot;path\\to\\your\\app&amp;quot;)&lt;/pre&gt;
  &lt;p id=&quot;wuVe&quot;&gt;По завершении развёртывания приложение отобразится на &lt;a href=&quot;https://www.shinyapps.io&quot; target=&quot;_blank&quot;&gt;shinyapps.io&lt;/a&gt; и будет доступно для просмотра и взаимодействия.&lt;/p&gt;
  &lt;h2 id=&quot;vPKe&quot;&gt;Подведение итогов&lt;/h2&gt;
  &lt;h3 id=&quot;3dxR&quot;&gt;Преимущества&lt;/h3&gt;
  &lt;ul id=&quot;RYIF&quot;&gt;
    &lt;li id=&quot;qgbe&quot;&gt;Использование в веб-визуализациях. Возможность браузерной реализации без знания HTML, CSS или JavaScript, и с использованием инструментария R.&lt;/li&gt;
    &lt;li id=&quot;8Yy9&quot;&gt;Разнообразие виджетов и шаблонов. Достаточно обширный выбор UI элементов.&lt;/li&gt;
    &lt;li id=&quot;50kM&quot;&gt;Возможность глубокой настройки внешнего вида.&lt;/li&gt;
    &lt;li id=&quot;Ph4I&quot;&gt;Бесплатное размещение на &lt;a href=&quot;https://www.shinyapps.io&quot; target=&quot;_blank&quot;&gt;shinyapps.io&lt;/a&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;ZgMm&quot;&gt;Недостатки&lt;/h3&gt;
  &lt;ul id=&quot;Wo50&quot;&gt;
    &lt;li id=&quot;K17V&quot;&gt;Использование непопулярного R.&lt;/li&gt;
    &lt;li id=&quot;2crr&quot;&gt;Плохая производительность языка R.&lt;/li&gt;
    &lt;li id=&quot;mFaR&quot;&gt;Невозможность или большая сложность постройки сложных UI.&lt;/li&gt;
  &lt;/ul&gt;

</content></entry></feed>