Загрузка пакетов в пакет Shiny app R с использованием Docker - PullRequest
1 голос
/ 10 июля 2020

У меня есть блестящее приложение, в котором пакеты загружаются с использованием library() в файле server.R . Это работает, но я не уверен, что это лучший способ сделать это.

Когда я преобразовал это приложение в пакет R, я удалил вызовы library. Добавлен файл DESCRIPTION и файл R, в котором я создал такую ​​функцию:

...
#' @importFrom tidyr gather spread
#' @importFrom viridisLite viridis inferno magma plasma
#' @importFrom writexl write_xlsx
#' @export
#' 
run_my_app <- function(display.mode="normal",launch.browser=TRUE,...) {
  appDir <- system.file("app", package="mypackage")  
  shiny::runApp(appDir,display.mode=display.mode,launch.browser=launch.browser,...)
}

После установки пакета запустите library(mypackage) и запустите функцию run_my_app(), которая запускает приложение в браузере. . Все работает.

Теперь я докерирую этот пакет app / R. Я пробую два способа, но, похоже, это не работает. Это первый подход (отображается только соответствующий код из Dockerfile ).

RUN mkdir /srv/shiny-server/mypackage
RUN Rscript -e 'system(paste0("cp -r ",system.file(package="mypackage"),"/app/* /srv/shiny-server/mypackage"))'
RUN sudo chown -R shiny:shiny /srv/shiny-server

EXPOSE 3838

# run shiny server
CMD ["/usr/bin/shiny-server.sh"]

При запуске как docker run --rm -p 127.0.0.1:3838:3838 myimage приложение запускается правильно, но функции из пакетов зависимостей не работают. работают, вероятно потому, что у меня нет вызовов library() или require().

Это второй подход (точно так же, как пользователь использовал бы пакет shiny app r), который позволяет избежать большей части приведенного выше сценария .

EXPOSE 3838
RUN Rscript -e 'library(mypackage);mypackage::run_my_app(port=3838,host="127.0.0.1",launch.browser=FALSE)'

Но я уже застрял на образе сборки docker, так как он запускает приложение во время сборки, и приложение тоже не работает должным образом.

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

Как лучше всего работать с библиотеками при стыковке блестящего пакета R приложения?

1 Ответ

0 голосов
/ 12 июля 2020

Оказывается, есть несколько способов запустить блестящее приложение внутри контейнера docker. И они отличаются тем, как работают. Подробности обсуждаются здесь .

В итоге я выбрал первый метод (по причинам, описанным в приведенной выше ссылке) и сохранил вызовы library(). Вызовы были перемещены в файл functions.R (имеет другие вспомогательные функции), который получен из ui.R и server.R, например source("functions.R",local=TRUE). Не уверен, нужен ли local=TRUE. Видел, что это рекомендовано в другом месте.

Детали о том, как обрабатывать вызовы NAMESPACE / library() и использовать блестящее приложение внутри пакета R, мне не совсем понятны. Поскольку вспомогательные функции внутри functions.R используются в ui.R и server.R, я использую их в обоих. Мне непонятно, какой файл выполняется первым.

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

CMD ["R", "-e", "mypackage::run_my_app(port=3838,host='127.0.0.1',launch.browser=FALSE)"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...