Разработка блестящего приложения в виде пакета и развертывание его на блестящем сервере

Я разрабатываю блестящее приложение, и поскольку я хотел использовать автоматическое тестирование и документацию функции, я начал разрабатывать интерфейс внутри пакета (как рекомендовано здесь).

Я разрабатываю это блестящее приложение в 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(".")

(Вы также можете увидеть это в действии, код здесь)