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

时间:2016-06-15 09:03:19

标签: r shiny devtools

我正在开发一个闪亮的应用程序,因为我想使用该功能的自动化测试和文档,我开始在一个包中开发接口(按照建议here)。

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

现在我想知道如何在服务器中启动我的应用程序。我天真地想着安装软件包并指向server.R文件,但这在某种程度上是行不通的。不确定问题出在哪里。

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

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

编辑部署到闪亮的服务器

由于 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.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服务器上使用。

3 个答案:

答案 0 :(得分:21)

当我将闪亮的应用程序作为独立程序包创建时,我通常会按如下方式组织文件:

在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(...)

答案 1 :(得分:10)

许多选票已经有了一个公认的答案,但我想补充一些内容,所以我也会自己回答。有关详细信息,请阅读我的文章Supplementing your R package with a Shiny app

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

- 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")
}

(您可以看到此操作;例如,shinyalert将此结构用于其演示应用。)

在评论中,您询问如何在闪亮的服务器上部署它。很简单,你只需要一个文件/srv/shiny-server/myapp.app.R来调用和运行该软件包(在服务器上安装软件包之后):

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

(你也可以看到这个,代码here

答案 2 :(得分:0)

许多带有概念验证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)