Date Редакция Категория comp Теги R / Shiny / учебник

Перевод-пересказ руководства.

Shiny — это пакет R, который позволяет легко и просто создавать интерактивные веб-приложения (apps) непосредственно на языке R. Этот урок позволит вам приступить к созданию собственных веб-приложений с помощью Shiny.

Если вы ещё не установили пакет Shiny, то подключитесь к Интернет, запустите R и выполните команду

> install.packages("shiny")

Этот учебник основывается на использовании RStudio IDE в качестве среды разработки. Эта среда особенно удобна для работы с Shiny, поскольку они разработаны одной компанией. Скачать RStudio IDE можно здесь.

Примеры

01_hello.png

Пакет Shiny поставляется с одиннадцатью примерами, иллюстрирующими его возможности. Каждый пример является самостоятельным Shiny-приложением.

Пример Hello Shiny строит гистограмму набора данных faithful, входящего в базовый комплект R, и позволяет задавать число её интервалов (bins). Пользователь может изменять число интервалов с помощью ползунка (slider bar) и приложение будет немедленно на это реагировать. Мы используем Hello Shiny чтобы разобраться в структуре веб-приложения, а затем создать своё первое приложение на Shiny.

Чтобы запустить Hello Shiny, введите:

> library(shiny)
> runExample("01_hello")

Структура приложения Shiny

Приложение на Shiny состоит из двух компонент:

  • скрипт с интерфейсом пользователя;
  • скрипт для сервера.

Скрипт с интерфейсом пользователя (user interface, UI) управляет расположением элементов управления и внешним видом приложения. Он находится в исходном файле ui.R. Вот как выглядит ui.R для Hello Shiny.

ui.R

library(shiny)

# Define UI for application that draws a histogram
shinyUI(fluidPage(

  # Application title
  titlePanel("Hello Shiny!"),

  # Sidebar with a slider input for the number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("distPlot")
    )
  )
))

Скрипт server.R содержит инструкции, которые необходимы компьютеру чтобы создать ваше приложение и управлять его поведением. server.R для примера Hello Shiny выглядит так:

server.R

library(shiny)

# Define server logic required to draw a histogram
shinyServer(function(input, output) {

  # Expression that generates a histogram. The expression is
  # wrapped in a call to renderPlot to indicate that:
  #
  #  1) It is "reactive" and therefore should re-execute automatically
  #     when inputs change
  #  2) Its output type is a plot

  output$distPlot <- renderPlot({
    x    <- faithful[, 2]  # Old Faithful Geyser data
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
})

С одной стороны, этот скрипт выглядит очень просто: выполняются некоторые вычисления, затем строится гистограмма с заданным числом интервалов. С другой стороны, вы можете заметить, что всё содержимое скрипта помещено в единственную функцию — renderPlot. Комментарий над вызовом этой функции даёт некоторые пояснения. Команды построения гистограммы "завернуты" в renderPlot и поэтому они: 1) "реактивны", то есть реагируют на изменение входных данных; 2) результатом их выполнения (выводом) является график. Таким образом функция renderPlot строит график, автоматически перестраивающийся при изменении входных данных.

Если эти объяснения показались вам слишком запутанными — не волнуйтесь. Постепенно мы рассмотрим все детали создания приложения.

Попробуйте пока поиграть с примером Hello Shiny. Просмотрите ещё раз исходный код и постарайтесь выработать в себе ощущение того, как это приложение работает.

Пока Hello Shiny работает, вы не сможете выполнять другие команды R. Всё это время R следит за работой Shiny-приложения и реагирует на изменения его входных данных. Чтобы вернуться в сеанс работы с R, нажмите Esc или щелкните на значок со знаком Stop (он находится в верхнем правом углу панели консоли RStudio).

Запуск приложения

Все приложения Shiny имеют одинаковую структуру: несколько R-скриптов, сохранённых в общей папке. В простейшем варианте таких скриптов всего два — уже знакомые нам ui.R и server.R.

Вы можете создать приложение Shiny, создав новую папку и поместив в неё файлы ui.R и server.R. Каждое приложение располагается в отдельной папке, а имя этой папки совпадает с именем приложения.

Кроме того, вы можете создать приложение Shiny с помощью мастера New Project... из меню File RStudio.

Запустить созданное приложение можно функцией runApp("имя_приложения"). Напомним, что имя приложения совпадает с именем папки, в которой оно хранится. Например, пусть файлы вашего Shiny-приложения находятся в папке my_app. Тогда запустить его можно с помощью следующего кода:

> library(shiny)
> runApp("my_app")

Примечание: runApp работает подобно read.csv, read.table и многим другим функциям R. Первый аргумент runApp представляет собой путь из вашего текущего рабочего каталога к каталогу (папке) приложения. В приведенном выше коде предполагается, что папка с приложением находится в вашем рабочем каталоге. В таком случае путь — это просто имя папки приложения.

Узнать путь к рабочему каталогу можно функцией getwd, а установить новый рабочий каталог — функцией setwd.

(На случай, если вам станет интересно: файлы из примера Hello Shiny хранятся в особой системной папке, названной "01_hello". Это сделано для того, чтобы их можно было запускать особым способом — с помощью функции runExample("01_hello").)

Ваша очередь

Создайте в вашем рабочем каталоге папку App-1 и скопируйте в неё приведенные выше ui.R и server.R (то есть скрипты из примера Hello Shiny). В результате папка приложения должны выглядеть так:

example1-folder.png

Запустите ваше приложение, набрав runApp("App-1"). Затем выключите его, нажав Esc, и внесите в приложение несколько изменений:

  • замените заголовок с "Hello Shiny!" на "Hello World!";
  • установите минимальное значение полозка равным 5;
  • поменяйте цвет гистограммы с "darkgray" на "skyblue".

Когда всё будет готово, запустите приложение вновь. Результат должен быть похож на то, что изображено на картинке ниже. Если ваше приложение выглядит как-то иначе, загляните в раздел с ответами и посмотрите как справились с задачей мы.

01_hello-modified.png

По умолчанию, приложения Shiny выводятся в обычном режиме (normal mode), вроде того, что показан на картинке выше. А вот Hello Shiny и другие встроенные примеры выводятся в другом — демонстрационном режиме (showcase mode) — при котором рядом с окном приложения демонстрируется код скриптов server.R и ui.R.

Если вы тоже хотите запустить приложение в демонстрационном режиме, наберите

> runApp("App-1", display.mode = "showcase")

Ответы

Измените заголовок вашего приложения и минимальное значение полозка в скрипте ui.R.

ui.R

library(shiny)

# Define UI for application that draws a histogram
shinyUI(fluidPage(

  # Application title
  titlePanel("Hello World!"),

  # Sidebar with a slider input for the number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 5,
                  max = 50,
                  value = 30)
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("distPlot")
    )
  )
))

Цвет гистограммы изменяется в скрипте server.R.

server.R

library(shiny)

# Define server logic required to draw a histogram
shinyServer(function(input, output) {

  # Expression that generates a histogram. The expression is
  # wrapped in a call to renderPlot to indicate that:
  #
  #  1) It is "reactive" and therefore should
  #     re-execute automatically when inputs change
  #  2) Its output type is a plot

  output$distPlot <- renderPlot({
    x    <- faithful[, 2]  # Old Faithful Geyser data
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'skyblue', border = 'white')
  })
})

И вновь запускаем приложение

Чтобы вновь запустить приложение:

  • наберите runApp("App-1") или
  • откройте файл ui.R или server.R в редакторе RStudio. RStudio распознает, что имеет дело с приложением Shiny, и в верхнем правом углу редактора появится кнопка Run App. Нажмите на неё, чтобы запустить приложение или используйте для этого комбинацию клавиш Ctrl+Shift+Enter.

run-app.png

По умолчанию, RStudio запускает приложение в новом окне, но вы можете выбрать другой способ запуска: в панели просмотра или во внешнем веб-браузере. Сделать выбор можно, кликнув по кнопке, расположенной по соседству с Run App.

launch-options.png

Резюме

Чтобы создать приложение Shiny нужно:

  • создать папку, названную также как и приложение;
  • сохранить в этой папке скрипты server.R и ui.R;
  • запустить приложение с помощью кнопки в RStudio, функции runApp или комбинации клавиш Ctrl+Shift+Enter;
  • выйти из приложения, нажав Esc.

Идём дальше

Вы можете начать создавать приложения Shiny, переделывая существующие примеры. Множество примеров находится в галерее Shiny, а одиннадцать поставляются вместе с пакетом:

system.file("examples", package="shiny")

runExample("01_hello") # a histogram
runExample("02_text") # tables and data frames
runExample("03_reactivity") # a reactive expression
runExample("04_mpg") # global variables
runExample("05_sliders") # slider bars
runExample("06_tabsets") # tabbed panels
runExample("07_widgets") # help text and submit buttons
runExample("08_html") # Shiny app built from HTML
runExample("09_upload") # file upload wizard
runExample("10_download") # file download wizard
runExample("11_timer") # an automated timer

Каждый из этих примеров демонстрирует какую-то из возможностей Shiny-приложений. Все примеры открываются в демонстрационном режиме, так что код приложения отображается на экране одновременно с самим приложением.

Стоит ли ограничивать себя, переделывая чужие приложения? Нет, конечно. Поэтому следующие несколько уроков мы посвятим созданию собственного приложения "с нуля". Постепенно вы узнаете как устроен каждый компонент приложения Shiny, а закончим мы рассказом о том, как развертывать свои приложения в Интернет.

Когда будете готовы, кликнете по ссылке Урок 2, чтобы перейти к следующему уроку. На нём вы узнаете как создать макет и настроить внешний вид своего Shiny-приложения.



Комментарии

comments powered by Disqus