Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практика ТОИ / Практика ТОИ - 2.docx
Скачиваний:
97
Добавлен:
21.04.2015
Размер:
1.56 Mб
Скачать

Загрузка файлов и указание путей

Обратите внимание на приведенный выше код. Для того, чтобы использовать функцию percent_map() необходимо было сначала запустить скрипт helpers.R, включающим эту функцию, и затем загрузить counties.rds с функцией readRDS(). Также необходимо было запустить библиотеки library(maps) и library(mapproj).

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

Поскольку helpers.R сохранен в том же директории, что и server.R, нужно сообщить об этом Shiny следующим образом:

> source("helpers.R")

Поскольку файл counties.rds находится в поддиректории (поименованном data) директория где находится server.R, то его загружаем так:

> counties <- readRDS("data/counties.rds")

Пакеты maps и mapproj загружаем как обычно:

> library(maps)

> library(mapproj)

здесь не требуется указывать пути к файлам.

Особенности выполнения скриптов

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

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

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

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

Итак, мы узнали что:

• сценарий server.R выполняется один раз, при запуске приложения;

• «безымянная» функция внутри shinyServer() запускается единожды,

каждый раз, когда пользователь посещает приложение;

• R выражения внутри render *() функции запускается много раз, каж

дый раз когда пользователь изменяет виджет.

Покажем, как следует использовать эту информацию.

Исходные скрипты, нужные библиотеки и наборы данных необходимо загрузить в начале сценария server.R, за пределами функции shinyServer(). Shiny запустит их один раз и настроит сервер для запуска R выражений, содержащихся в shinyServer().

Определить конкретного пользователя объекта внутри «безымянной» функции function(), но за пределами каких-либо render*() вызовов. Они будут объектами, закрепленными за конкретными пользователями. Например, объект, который записывает информацию о сеансе пользователя. Этот код будет выполняться один раз для каждого пользователя.

Наконец, код который нужно часто перезапускать следует разместить внутри render*() функции. Shiny будет перезапускать отдельные «куски» этого кода каждый раз, когда пользователь использует для управления виджет упомянутый в этом «куске». Это может быть довольно часто.

Следует вообще избегать размещения кодов внутри render*() функции, которые не должны быть там. Такой код будет замедлять работу всего приложения.

Соседние файлы в папке Практика ТОИ