Пользователям не часто хотят знать, как все устроено внутри вашего сервиса / приложения и т.д. Им нужен понятный инструмент, чтобы с ним работать (какие данные внести и как получить результат). Например, так или так
Интерфейс – совокупность возможностей, способов и методов взаимодействия двух систем или устройств для обмена информацией между ними
Пользовательский интерфейс – разновидность интерфейсов, в котором одна сторона представлена человеком
Одна из возможных технологий при работе с R – Shiny
Одним из методов представления результатов исследования является создание интерактивных веб-приложений. Технология Shiny, разработанная в RStudio, позволяет создавать такие приложения, не требуя при этом каких-либо навыков веб-программирования, однако обладая такими навыками, можно получить гораздо более детально настроенные приложения.
Приложение на Shiny – это пользовательский интерфейс (в виде веб-страницы) (User Interface, UI), связанный со скриптом R, реализующим всю функциональность (Server). Т.е. есть интерфейс, в котором описано, как все выглядит для пользователя, и есть сервер, который описывает, как все работает (как построить график, как посчитать, что рекомендуется конкретному пользователю и т.д.)
Есть два способа структурировать файлы при создании приложений Shiny
ui и server (названия менять нельзя). Название файла = app.R (и только так!)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)