Интерфейсы

Пользователям не часто хотят знать, как все устроено внутри вашего сервиса / приложения и т.д. Им нужен понятный инструмент, чтобы с ним работать (какие данные внести и как получить результат). Например, так или так

Интерфейс – совокупность возможностей, способов и методов взаимодействия двух систем или устройств для обмена информацией между ними

Пользовательский интерфейс – разновидность интерфейсов, в котором одна сторона представлена человеком

Одна из возможных технологий при работе с R – Shiny

Введение в Shiny

Одним из методов представления результатов исследования является создание интерактивных веб-приложений. Технология Shiny, разработанная в RStudio, позволяет создавать такие приложения, не требуя при этом каких-либо навыков веб-программирования, однако обладая такими навыками, можно получить гораздо более детально настроенные приложения.

Как все устроено

Приложение на Shiny – это пользовательский интерфейс (в виде веб-страницы) (User Interface, UI), связанный со скриптом R, реализующим всю функциональность (Server). Т.е. есть интерфейс, в котором описано, как все выглядит для пользователя, и есть сервер, который описывает, как все работает (как построить график, как посчитать, что рекомендуется конкретному пользователю и т.д.)

Есть два способа структурировать файлы при создании приложений Shiny

  1. Все в одном файле. Обязательно создаются объекты ui и server (названия менять нельзя). Название файла = app.R (и только так!)
  2. Код сервера сохраняется в файл server.R, интерфейса – ui.R (названия менять опять же нельзя). Оба файла хранятся в одной папке.

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

Создание приложения

File -> New File -> Shiny Web App

По умолчанию создается пример с гистограммой.

Чтобы запустить приложение нужно либо нажать кнопку Run App (справа сверху), либо выполнить код runApp("путь к папке с приложением")

Интерфейс

Посмотрим на интерфейс. В нем есть заголовок (titlePanel) и “все остальное”, разделенное на боковую панель (sidebarPanel) и основную панель (mainPanel). На боковой панели размещен элемент “ползунок” (sliderInput), на основной – место для вывода графика (plotOutput).

Т.е. структура вложенная, состоящая из так называемых контейнеров (страница - главная часть - боковое меню - слайдер). Если в одном контейнере несколько элементов, то они разделяются запятыми

Типов элементов много, выбираем те, что нужны https://shiny.rstudio.com/gallery/widget-gallery.html + элементы, не требующие каких-то действий (картинки, линии и т.д.)

Попробуем: добавим после слайдера линию (hr()) и поле для ввода числа (numericInput())

У элементов, с помощью которых вводим значения (поля для ввода, слайдеры, чекбоксы и т.д.) и у элементов, в которых мы показываем результат (график, таблица и т.д.), обязательно указываются имена – Id (первый параметр при создании). С помощью этих имен можно обращаться к этим элементам при описании логики действий приложения – либо “забирать” с них данные, либо отображать в них результат.

Сервер

Все элементы для ввода данных хранятся в списке input, для вывода – output. Поэтому для отображения результата (например, графика) мы сохраняем итог наших действий (код, рисующий график) в соответствующий объект. В нашем примере – output$distPlot, где distPlot – имя, которое мы задали при создании элемента для отображения графика в ui.

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

Для получения значений с элементов ввода используется список input. Так в примере, input$bins – это значение, указанное пользователем на слайдере.

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

И еще немного о том, как все работает

Ваша очередь:

Первоначальный код

library(recommenderlab)
data(MovieLense)
similarity_users10 <- similarity(MovieLense[1:10, ], method = "cosine", which = "users")
image(as.matrix(similarity_users10), main = "User similarity")

Код в shiny

library(shiny)

library(recommenderlab)
data(MovieLense)

ui <- fluidPage(
   titlePanel("Similarity between users"),
   sidebarLayout(
      sidebarPanel(
         sliderInput("users",
                     "Number of users:",
                     min = 2,
                     max = 30,
                     value = 10)
      ),
      mainPanel(
         plotOutput("heatMap")
      )
   )
)

server <- function(input, output) {
   output$heatMap <- renderPlot({
     similarity_users <- similarity(MovieLense[1:input$users, ], method = "cosine", which = "users")
     image(as.matrix(similarity_users), main = "User similarity")
   })
}

# Run the application 
shinyApp(ui = ui, server = server)