Пришло сделать по-настоящему живое приложение. Этот урок позволит вам создавать приложения с откликом на действия пользователя. Реактивный выход автоматически среагирует при включении пользователем виджета.
К концу этого урока, вы будете знать, как сделать простое приложение Shiny с помощью двух строк текста. Каждая строка будет отображать значения виджета на основе того, что было введено пользователем.
Для нового приложения потребуется своя собственная новая папка. Создайте папку в рабочей директории под именем census-app. В ней мы будем сохранять файлы ui.R и server.R, созданные в ходе этого урока.
Реактивнй выход можно создать в два этапа: 1. Добавть объект R в пользовательский интерфейс ui.R 2. Рассказать Shiny о том, как создать объект в server.R. Объект будет реактивным, если прописанный код будет обращаться к значению виджета.
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 будет повторно запускать на выполнение инструкции каждый раз, когда необходимо обновить объект. Для этого, чтобы работать, ваше выражение должно возвращать объект, который вы имеете в виду (кусок текста, график, набор данных и т.д.). Вы получите ошибку, если выражение не возвращает объект, или если она возвращает неправильный тип объекта.
. Значения “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 создает реактивный выход.
Добавьте вторую строку реактивного текста в главную панель вашего приложения 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 и внешние наборы данных.