【问题标题】:developing shiny app as a package and deploying it to shiny server将闪亮的应用程序开发为一个包并将其部署到闪亮的服务器
【发布时间】:2016-10-16 07:06:25
【问题描述】:

我正在开发一个闪亮的应用程序,因为我想使用函数的自动化测试和文档,我开始在一个包中开发接口(推荐here)。

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

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

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

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

EDIT 部署到闪亮的服务器

由于 Colin D 在 cmets 中询问如何在闪亮的服务器上部署这些软件包,我想演示一下我是如何做到这一点的。

首先,我使用以下命令直接通过命令行以 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 服务器上使用的。

【问题讨论】:

  • 我这样做是例行公事。我将我的应用程序文件放在包的inst 目录中,并包含一个名为launch_application 的函数,它仅使用我想要的默认参数调用runApp。应用程序文件通过system.file 找到
  • 听起来像我要找的东西。那么inst 文件夹中有哪些文件?只是调用launch_application 函数和library 调用?由于我将每个函数放在R 文件夹中的一个额外文件中,我希望我可以将它们导出并加载我的包...

标签: r shiny shiny-server devtools


【解决方案1】:

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

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

【讨论】:

  • 啊,现在我明白了...所以server.Rui.R 进入application 文件夹,只有我的函数留在R 文件夹中。不过我会试一试...
  • 也许是一个更具体的问题......我在我的服务器文件中使用DT::renderDataTable。我应该在哪里实际加载库?我首先将DT 作为我的DESCRIPTION 文件中的依赖项,现在,因为我将server.R 移动到应用程序目录中,在构建包时抱怨,我不使用所有依赖项。
  • Suggests 下列出DT 你应该没问题。
  • 好的,我花了一段时间才发现我必须将shiny_server.conf 中的app_dir 设置为system.file('application', package='my_pkg') 的输出... 因为我正在创建一个文件@ 987654344@,加载包并使用您的建议launch_application 函数,但它以ERROR: Key / already in use 结束...不是它正在工作!谢谢
  • 如何在闪亮的服务器上部署这种格式的应用程序?
【解决方案2】:

已经有很多投票的公认答案,但我想补充一些东西,所以我也会回答自己。更多信息可以阅读我的文章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

【讨论】:

  • 嗨,感谢@DeanAttali,您的代码!我已经记录了文件 myapp/global.R。它包含应用程序使用的所有功能。如何将它们添加到包的文档中?
  • 谢谢你,@DeanAttali,你的解释对我有帮助。
【解决方案3】:

许多带有概念验证 Shiny 演示的软件包并不是为在 Shiny Server 上部署而设计的,而是在旨在从 RStudio 运行的函数中包含类似的内容:

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

此函数在 Shiny Server 中不起作用(您不能在 runApp 中运行 runApp),但它提供了一些关于如何创建 app.R 的线索,该 app.R 可以充当在 @ 中使用的占位符987654324@

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

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 2014-08-09
    • 2021-02-22
    • 2016-05-23
    • 1970-01-01
    • 2016-11-16
    • 2020-01-26
    • 2014-09-12
    • 2020-10-23
    相关资源
    最近更新 更多