Пришло сделать по-настоящему живое приложение. Этот урок позволит вам создавать приложения с откликом на действия пользователя. Реактивный выход автоматически среагирует при включении пользователем виджета.

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

Mountain View

Для нового приложения потребуется своя собственная новая папка. Создайте папку в рабочей директории под именем census-app. В ней мы будем сохранять файлы ui.R и server.R, созданные в ходе этого урока.

Два шага

Реактивнй выход можно создать в два этапа: 1. Добавть объект R в пользовательский интерфейс ui.R 2. Рассказать Shiny о том, как создать объект в server.R. Объект будет реактивным, если прописанный код будет обращаться к значению виджета.

Шаг первый: добавляем объект R в UI

Shiny предоставляет семейство функций, которые превращают объекты R в выходы пользовательского интерфейса. Каждая из этих функций создает специфический тип выхода.

Output function creates
htmlOutput raw HTML
imageOutput image
plotOutput plot
tableOutput table
textOutput text
uiOutput raw HTML
verbatimTextOutput text

Вы можете добавить выход в пользовательский интерфейс тем же способом, что и HTML-элементы и виджеты. Разместите функцию выхода в боковой панели (sidebarPanel) или главную панель (mainPanel) в файле ui.R. Например, в файле ui.R, размещенном ниже используется textOutput, чтобы добавить строку в главную панель:

# ui.R

shinyUI(fluidPage(
  titlePanel("censusVis"),
  
  sidebarLayout(
    sidebarPanel(
      helpText("Create demographic maps with 
        information from the 2010 US Census."),
      
      selectInput("var", 
        label = "Choose a variable to display",
        choices = c("Percent White", "Percent Black",
          "Percent Hispanic", "Percent Asian"),
        selected = "Percent White"),
      
      sliderInput("range", 
        label = "Range of interest:",
        min = 0, max = 100, value = c(0, 100))
    ),
    
    mainPanel(
      textOutput("text1")
    )
  )
))

Обратите внимание, что аргументом функции textOutput является текстовая строка “text1”. Каждая из функций вывода *Output требует одного аргумента: текстовая строка, которую SHiny воспринимает как инструкцию для создания объекта.

Сделайте это путем вставки в R код, который создает объект в server.R. Код должен идти в безымянной функции, которая появляется внутри shinyServer в вашем скрипте server.R. Безымянная функция играет огромную роль в работе Shiny: она строит спископодобный объект с именем вывод, который содержит весь код, необходимый для обновления объектов R в приложении. Каждый объект R должен иметь свою собственную запись в списке. Вы можете создать запись, определяя новый элемент для вывода в безвмянную функцию, как показано ниже. Имя элемента должно совпадать с именем реактивного элемента, который вы создали в ui.R.

В скрипте ниже, output$text1 соответствует textOutput(“text1”) в вашем файле ui.R.

# server.R

shinyServer(function(input, output) {

     output$text1 <- renderText({ 
          "You have selected this"
     })

  }
)

Вам не нужно организовывать безымянную функцию для возврата результата в последней строке кода. R будет автоматически обновлять вывод. Каждая запись для вывода должна содержать вывод одной из открывающих функций render Shiny. Эти функции захватывают выражение R и выполняют предварительную обработку выражения. Используйте открывающую функцию render, которая соответствует типу реактивного объекта, который вы делаете.

renderImage images (saved as a link to a source file)
renderPlot plots
renderPrint any printed output
renderTable data frame, matrix, other table like structures
renderText character strings
renderUI a Shiny tag object or HTML

У каждой открывающей функции render один аргумент: выражение R, окруженное фигурными скобками {}.Выражение может состоять из одной простой строки текста, или он состоять из нескольких строк кода, как если бы это был вызов сложной функции. Подумайте об этом выражении R как о наборе инструкций, которые вы даете Shiny для хранения на будущее. Shiny будет выполнять инструкции при первом запуске приложения, а затем Shiny будет повторно запускать на выполнение инструкции каждый раз, когда необходимо обновить объект. Для этого, чтобы работать, ваше выражение должно возвращать объект, который вы имеете в виду (кусок текста, график, набор данных и т.д.). Вы получите ошибку, если выражение не возвращает объект, или если она возвращает неправильный тип объекта.

Использование значений виджета

Если вы запустите скрипт server.R выше, приложение Shiny будет отображать “You have selected this” на главной панели. Тем не менее, текст не будет реактивным. Он не будет меняться, даже если вы манипулировать виджеты вашего приложения. Вы можете сделать текст реактивной запрашивая Shiny вызвать значение виджета, когда он строит текст. Давайте посмотрим, как это сделать. Взгляните на первую строку кода в server.R. Вы заметили, что безымянная функция содержит два аргумента, входной и выходной? Вы уже видели, что выход это спископодобный объект, который хранит инструкции для создания объектов R в вашем приложении. Вход это второй спископодобный объект. Он хранит текущие значения всех виджетов в вашем приложении. Эти значения будут сохранены под именами, которые вы дали виджетам в ui.R. Так, например, наше приложение содержит два виджета, один под названием “Var” и второй под названием “range” (вы дали виджетам эти имена в уроке 3

. Значения “Var” и “range” будут сохранены в качестве входных (input) как input\(var и input\)range. К.т. виджет слайдера содержит две переменные (минимум и максимум), С слайдер виджет имеет два значения (минимум и максимум), input$range будет содержать вектор из двух элементов. Shiny автоматически сделает объект реактивным если объект использует входное значение. Например, файл server.R ниже создает реактивную строку текста с помощью вызова значения выбора виджета ячейки, чтобы построить текст.

# server.R

shinyServer(
  function(input, output) {
  
    output$text1 <- renderText({ 
      paste("You have selected", input$var)
    })
    
  }
)

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

Таким образом вы создаете реактивность с помощью Shiny, соединяя значение входа с объектом на выходе. Shiny принимает во внимание все другие детали.

Запустите приложение и посмотрите реактивный выход

Когда вы будете готовы, обновите файлы server.R и ui.R, чтобы они соответсвовали с показанными выше. затем запустите приложение следующим образом:

runApp("censusVis", display.mode = "showcase") 

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

Посмотрите сценарий server.R. Когда Shiny перестраивает выход, выделяется строка кода, которая выполняется. Это временное выделение, которое помогает вам видеть, как Shiny создает реактивный выход.

Mountain View

Ваша очередь

Добавьте вторую строку реактивного текста в главную панель вашего приложения Shiny. Эта строка должна содержать “You have chosen a range that goes from something to something”, и каждое something должно показывать текущее минимальное и максимальное значение виджета слайдера. Не забудьте обновить ваши файлы ui.R и server.R.

Подсказка

Ваши файлы должны выглядить следующим образом

# ui.R

shinyUI(fluidPage(
  titlePanel("censusVis"),
  
  sidebarLayout(
    sidebarPanel(
      helpText("Create demographic maps with 
        information from the 2010 US Census."),
      
      selectInput("var", 
        label = "Choose a variable to display",
        choices = c("Percent White", "Percent Black",
          "Percent Hispanic", "Percent Asian"),
        selected = "Percent White"),
      
      sliderInput("range", 
        label = "Range of interest:",
        min = 0, max = 100, value = c(0, 100))
    ),
    
    mainPanel(
      textOutput("text1"),
      textOutput("text2")
    )
  )
))

и

# server.R

shinyServer(
  function(input, output) {
  
    output$text1 <- renderText({ 
      paste("You have selected", input$var)
    })
    
    output$text2 <- renderText({ 
      paste("You have chosen a range that goes from",
        input$range[1], "to", input$range[2])
    })
    
  }
)

Обсуждение

добавьте вторую строку текста таким же образом, как и первую. Используйте textOutput в ui.R чтобы разместить вторую строку текста на главной панели (mainPanel). Используйте renderText в server.R, чтобы показать Shiny как построить текст. Вы должны будете использовать то же имя для обозначения текста в двух файлах (например, “text2”).

Ваш текст должне использовать как минимальное, так и максимальное значение слайдера, которые сохраняются как input\(range[1] и input\)range[2] соответственно.

Помните, что ваш текст будет таким, как долго, как вы подключите входные значения для вывода объектов. Shiny создает реактивность автоматически, когда он распознает такие связи.

Повторение

В этом уроке вы научились создавать свое первое реактивное приложение Shiny. В ходе этого вы научились: * использовать выходную функцию Output в файле ui.R чтобы разместить реактивный объект в приложении; * использовать функцию рендинга render в файле server.R чтобы показать Shiny как строить объекты; * окружать выражения R фигурными скобками {} в каждой функции рендинга render; * сохранять выраждения рендинга в списке выхода, по одному для кажого реактивного объекта в приложении; * создавать реактивность путем включения входных значений в выражение рендинга.

Если вы будете следовать этим правилам, Shiny автоматически делать объекты реактивными.

В уроке 5 вы создадите более изящное реактивное приложение на основании скрипты R и внешние наборы данных.