Разработка блестящего приложения в виде пакета и развертывание его на блестящем сервере
Я разрабатываю блестящее приложение, и поскольку я хотел использовать автоматическое тестирование и документацию функции, я начал разрабатывать интерфейс внутри пакета (как рекомендовано здесь).
Я разрабатываю это блестящее приложение в RStudio, и у меня есть файл server.R
, который я могу щелкнуть по кнопке Запустить приложение в RStudio, и все работает. Я передаю свой пакет в репозиторий github, и с этого момента я хочу установить его на свой блестящий сервер R, используя функции devtools
и install_github
.
Теперь мне интересно, как запустить приложение на сервере. Я наивно думал установить пакет и указывать на файл server.R
, но это как-то не работает. Не знаете, где проблемы.
Моя вторая попытка заключалась в создании файла с именем app.R
в папке, доступной на блестящем сервере, и в этом файле я загружаю свой пакет, блестящие и другие необходимые пакеты, но он как-то жалуется из-за недостающих переменных...
Может кто-нибудь дать мне совет? Я также с удовольствием отвечу на любой вопрос, так как я не уверен, как правильно задавать эту проблему.
Спасибо заранее.
EDIT Развертывание на блестящем сервере
Поскольку Colin D спрашивал в комментариях, как развернуть эти пакеты на блестящем сервере, я хотел продемонстрировать, как я это делаю.
Прежде всего, я устанавливаю свой пакет на блестящем сервере напрямую через командную строку как root с помощью следующей команды.
su - -c "R -e \"devtools::install_github('user/shinypackage')\""
Следующим шагом будет изменение владельца папки пакета
chown -R shiny:shiny /usr/local/lib/R/site-library/shinypackage/
Затем я перезапускаю блестящий сервер, так как это иногда проблематично с кешированием или так.
systemctl restart shiny-server
Это шаги, которые я выполняю, когда обновляю свое блестящее приложение. Я делаю это обычно снова как root в одной строке
su - -c "R -e \"devtools::install_github('user/shinypackage')\"" & chown -R shiny:shiny /usr/local/lib/R/site-library/shinypackage/ & systemctl restart shiny-server
Нам остается только установить каталог в файле shiny-server.conf
. Я просто добавил путь пакета + каталог приложения, где сохраняются ui.R
и server.R
.
location /shinypackage {
app_dir /usr/local/lib/R/site-library/shinypackage/application;
log_dir /var/log/shiny-server;
}
Затем мне нужно снова перезапустить сервер, используя systemctl restart shiny-server
.
Это используется на сервере Ubuntu.
Ответы
Ответ 1
Когда я делаю блестящие приложения в виде автономного пакета, я обычно упорядочиваю файлы так:
В каталоге R:
- Все мои методы поддержки приложения (они должны быть экспортированы, если они будут использоваться в файлах
ui.R
, server.R
или global.R
)
- Функция A
launch_application
Определение launch_application
аналогично:
launch_application <- function(x, ...)
{
shiny::runApp(appDir = system.file("application", package = [my_pkg]),
...)
}
В каталоге inst
-
application/server.R
-
application/ui.R
-
application/global.R
После создания и установки пакета мне просто нужно запустить
library(my_pkg)
launch_application(...)
Ответ 2
Уже есть принятый ответ с большим количеством голосов, но я хотел бы добавить несколько вещей, поэтому я тоже отвечу сам. Для получения дополнительной информации вы можете прочитать мою статью Дополнение вашего пакета R приложением Shiny.
Это структура папок, которую я использую:
- mypacakge
|- inst
|- myapp
|- ui.R
|- server.R
|- R
|- runApp.R
|- ...
|- DESCRIPTION
|- ...
Внутри папки R/
я помещаю весь не блестящий код. Код самого блестящего приложения живет в inst/
. Файл R/runApp.R
определяется как
#' @export
runExample <- function() {
appDir <- system.file("myapp", package = "mypackage")
if (appDir == "") {
stop("Could not find myapp. Try re-installing 'mypackage'.", call. = FALSE)
}
shiny::runApp(appDir, display.mode = "normal")
}
(Вы можете увидеть это в действии; например, глянцевый сервер использует эту структуру для своего демонстрационного приложения).
В комментарии вы спросили, как это можно развернуть на блестящем сервере. Это просто, вы можете просто иметь файл /srv/shiny-server/myapp.app.R
который вызывает и запускает этот пакет (после того, как вы установили пакет на сервере):
dir <- system.file("myapp", package = "mypackage")
setwd(dir)
shiny::shinyAppDir(".")
(Вы также можете увидеть это в действии, код здесь)