开发闪亮​​的应用程序作为一个包并将其部署到闪亮的服务器

developing shiny app as a package and deploying it to shiny server

我正在开发一个闪亮的应用程序,因为我想使用该功能的自动化测试和文档,所以我开始在一个包中开发界面(按照推荐 )。

我在 RStudio 中开发了这个闪亮的应用程序,我有一个 server.R 文件,我可以单击 RStudio 中的 运行 App 按钮,一切正常.我将我的包提交到 github 存储库,从这一点开始,我想使用 devtoolsinstall_github 函数将它安装在我的 R shiny server 上。

现在我想知道如何在服务器中启动我的应用程序。我天真地想安装包并指向 server.R 文件,但这不知何故不起作用。不知道问题出在哪里。

我的第二次尝试是在 shiny 服务器可访问的文件夹中创建一个名为 app.R 的文件,在这个文件中我基本上加载了我的包、shiny 和其他需要的包,但它由于缺少变量而以某种方式抱怨。 ..

有人可以给我一个建议吗?我也很乐意回答任何问题,因为我不确定如何正确地提出这个问题。 提前致谢。

编辑部署到闪亮的服务器

由于 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

这些是我更新 shiny 应用程序时执行的步骤。我通常以 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.Rserver.R的应用程序目录。

  location /shinypackage {
    app_dir /usr/local/lib/R/site-library/shinypackage/application;
    log_dir /var/log/shiny-server;
  }

然后我必须使用systemctl restart shiny-server重新启动服务器。

这正在 Ubuntu 服务器上使用。

当我将闪亮的应用程序作为独立包制作时,我通常这样组织文件:

在R目录中:

  • 我支持该应用程序的所有方法(如果它们将在 ui.Rserver.Rglobal.R 文件中使用,则应导出它们)
  • 一个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(...)

已经有一个接受了很多投票的答案,但我想补充一些东西,所以我也会回答自己。更多信息可以看我的文章Supplementing your R package with a Shiny app.

这是我使用的文件夹结构:

- mypacakge
  |- inst
      |- myapp
         |- ui.R
         |- server.R
  |- R
     |- runApp.R
     |- ...
  |- DESCRIPTION
  |- ...

R/ 文件夹中,我放置了所有 non-shiny 代码。闪亮应用程序本身的代码位于 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")
}

(您可以在实际操作中看到这一点;例如,shinyalert 将此结构用于其演示应用程序)。

在评论中,您询问了如何将其部署在闪亮的服务器上。很简单,您只需拥有一个文件 /srv/shiny-server/myapp.app.R 即可调用并运行该包(在服务器上安装该包之后):

dir <- system.file("myapp", package = "mypackage")
setwd(dir)
shiny::shinyAppDir(".")

(您也可以在实际操作中看到这一点,代码 here

许多带有概念验证 Shiny 演示的包并不是为在 Shiny Server 上部署而设计的,而是在 RStudio 的 运行 函数中包含类似这样的东西:

fooRun <- function() {
   app <- shinyApp(appUI, appServer)
   runApp(app, launch.browser = TRUE, ...)
}

此函数在 Shiny Server 中不起作用(您不能在 runApp 中 运行 runApp),但它提供了一些关于如何创建 app.R 可以作为占位符在 /srv/shiny-server/foo/app.R

中使用
library("foo")
shinyApp(ui = foo:::appUI, server = foo:::appServer)