构建一个闪亮的应用程序包

4月30日,二千零一十九
通过

(本文首次发表于 (en)R工作队,并对 188bet appR博主

闪亮的应用程序包

在一个上岗,我介绍了{傀儡}包裹,哪个是用于构建生产就绪的闪亮应用程序的固定框架.这个框架首先创建一个等待填充的包骨架。

但是,在一个以一系列文件创建闪亮应用程序的世界里,为什么要费心打包?这是我将在这篇博文中关注的问题。

闪亮的应用程序里有什么?

好啊,所以我们换个角度来问这个问题。想想你最后一金宝搏网址个闪亮的文件(应用程序)或两个文件应用程序(用户界面服务器R)你有这两个,然后你把它们放进一个文件夹。

所以,让我们回顾一下对于一个健壮的应用程序,您接下来需要什么.

第一,元数据。换言之,应用程序的名称,版本号(对于任何严重的生产水平项目)应用程序的功能,如果有问题,联系谁。

然后,你得想办法处理依赖项.因为你知道,当你想把你的应用推到生产中时,您不能与它进行此对话:

嘿,我尝试“source”(“app.r”),但有一个错误。

R-DEV:错误是什么?

它:上面写着“找不到‘闪亮’的包裹”。

R DEV:啊,是的,您需要安装闪亮。尝试运行“install.packages”(“shining”)。

好的。还有什么?

R-DEV:让我想想,还可以尝试“install.packages”(“dt”)“…好吗?”现在尝试“install.packages”(“ggplot2”),还有…

[…]

好的,现在我找到“app.r”,正确的?

R - DEV:当然!

它:好的,所以它说“找不到函数runapp()”

R DEV:啊,你必须在你的剧本开始的时候做图书馆(闪亮的)。和图书馆(purr)和库(jsolite)*。

*这将导致上的命名空间冲突平坦()可能导致调试头痛的功能。所以,嘿,如果我们能有一个只从包中导入特定功能的闪亮应用程序,那就太酷了。正确的?

所以,是的,依赖关系很重要。你需要处理它们,正确处理。

现在,假设你正在构建一个大应用程序。有成千上万行代码的东西。用这么多行来处理一个或两个文件闪亮的应用程序只是一场噩梦。所以,怎么办?让我们将所有内容拆分为可以调用的较小文件!

最后,我们希望我们的应用程序长命百岁,这意味着我们需要记录:每一小段代码都应该有一段注释解释这些特定行的作用。从长远来看,我们需要的另一件事就是测试,所以我们确定我们不会引入任何回归。

哦,如果人们能得到葛兰素并安装在他们的电脑上,并可以访问应用程序的本地副本!

好啊,所以,让我们总结一下:我们想要构建一个应用程序。这个应用程序需要元数据并处理依赖关系直截了当地说,这就是你从中得到的描述+命名空间包的文件。更实际的是,您可以在包内执行“选择性名称空间提取”,也就是说,您可以说“我想从这个包中得到这个函数”。也,一个大的应用程序需要拆分成更小的R文件夹,这就是包装的组织方式。我不需要强调文档是任何包装的重要组成部分,所以我们在这里也解决了这个问题。所以是测试工具包.当然,当一个闪亮的应用程序出现在一个软件包中时,“到处安装”的愿望就实现了。

另一面是闪亮的包裹

测试

未经测试,任何产品都不应投入生产。没有什么。测试生产应用程序是一个广泛的问题,我会坚持在一个包里测试。

包测试的框架是健壮的,并且有广泛的文档记录。所以您不必在这里付出任何额外的努力:只需使用一个规范的测试框架,比如{Test}.学习如何使用它不是本帖的主题,所以请参考文档。另见第5章“构建一个持续的包”.

你应该测试什么?

  • 首先,正如我们之前所说,应用程序应该在UI部分和后端(或“业务逻辑”)部分之间进行拆分。这些后端函数应该在没有任何交互上下文的情况下运行,就像简单的旧功能一样。所以对于这些人,你可以做古典测试.因为它们是后端功能(因此特定于项目),{傀儡}不能提供任何帮助。
  • 对于UI部分,记住,任何UI函数都是为呈现HTML元素而设计的。.所以你可以将文件保存为HTML,然后将其与golem::expect_html_equal()。.
library(闪亮)ui<-taglist(h1(“hello world!”)HTMLTOOLS::保存HTML(UI,“ui.html”)golem::expect_html_equal(ui,“ui.html”)35;更改ui<-taglist(h2(“hello world!”))golem::期望“html”等于(ui,“UI.html”

例如,如果需要测试模块,这可能很有用。UI模块函数返回HTML标记列表,因此,一旦设置好模块,就可以保存它们并在测试中使用它们。

我的_mod_ui<-函数(id)ns<-ns(“id”)标记列表(selectinput(ns(“this”),“那个”choices=letters[1:4])my_mod_ui_test<-tempfile(fileext=“html”)htmltools::save_html(my_mod_ui(“test”),一段时间后我的测试当然,保存在测试文件夹中,#不是作为临时文件golem::expect_html_equal(my_mod_ui(“test”),MyoMudiuui试验

{傀儡}还提供两个功能,期望_Shinytag())期望你的精神支柱,测试对象是否属于类“闪亮的标签”“闪亮标记列表”.

  • 测试包启动:启动时golem::使用_推荐的_测试(),你会发现一个测试建立在{PrimeX}这样可以检查应用程序是否可以启动。以下是对发生情况的简短描述:
#标准测试ThingsContext(“启动”)库(processx)测试::测试(“应用程序启动”),我们正在创建一个运行应用程序x的新进程<-process$new(“r”,C(“-E”)#正如我们在测试/测试中所做的那样,在启动整个软件包之前,我们将后退两步,并尝试启动应用程序“setwd('../../');pkgoad::load_all();run_app()“)我们会留出一些时间让应用程序启动根据您的需要配置此项sys.sleep(5)我们会检查应用程序是否处于活动状态,预期为真(x$is_alive())我们会杀死它x$kill())

注释:此特定配置可能会在连续集成平台(如Gitlab CI或Travis)上失败。解决方法是,在你的内心深处,首先安装软件包远程:安装本地(),然后更换setwd(…)运行命令与myuberapp::运行_app()。.

例如:

  • 在里面GITLAB-CI.YML
测试:阶段:测试脚本:-echo“正在运行测试”-r-e“remotes::install_local()”-r-e“devtools::check()”
  • 在里面测试傀儡
testtthat::test_that(“应用启动”,x<-process$new(“r”,C(“-E”)“datuberapp::run_app()”)sys.sleep(5)expect_true(x$is_alive())x$kill())

文档化

对任何R开发人员来说,记录包都是很自然的事情。任何导出的函数都应该有自己的文档,因此,您必须“强制”记录任何面向用户的函数。

也,构建一个闪亮的应用程序作为一个软件包,允许您编写标准的R文档:

  • 自述文件在你的包的根
  • 小饰物这解释了如何使用你的应用程序
  • {PKGDOWN }它可以用作应用程序的外部链接。

部署

本地部署

因为你的闪亮应用程序是一个标准包,它可以作为一个葛兰素,发给你的同事,朋友,家庭甚至到了裂缝。它也可以安装在任何R包存储库中。然后,如果你用{傀儡},你只需要做:

库(myuberapp)运行_app()

启动应用程序。

rstudio connect和shining服务器

这两个平台都需要文件应用程序配置,也就是说应用程序文件或用户界面/服务器R文件夹。那么,我们如何将这个“闪亮应用程序包”集成到Connect或Shiny服务器中呢?

  • 使用内部包管理器rstudio包管理器,如果安装了软件包应用程序,然后你只需要创建一个应用程序前面这一节的小代码。
  • 正在将包文件夹上载到服务器。在那种情况下,您可以使用Package文件夹作为应用程序包,上传全部内容。然后,写一篇文章应用程序这样做:
pkload::load_all()闪亮::Shinyapp(ui=app_ui(),服务器=应用程序服务器)

当然,别忘了把这个文件列在忽略

这是你跑步时会得到的文件golem::添加连接文件().

码头集装箱

为了使你的应用程序Dockerize,只需像其他软件包一样安装软件包,作为一个CMD r-e'选项(“shining.port”=80,shining.host=“0.0.0.0”);myuberapp::run_app()'.当然,把港口改成你需要的港口。

你会得到你需要的文件golem::添加dockerfile()。.

资源

岗位构建一个闪亮的应用程序包首次出现在(en)R工作队.

留下评论作者,请关注他们博客上的链接和评论: (en)R工作队.

188bet appR博客提供 每日电子邮件更新金宝搏网址 R新闻与 教程关于以下主题: 数据科学大数据, r作业,可视化(可视化) GGPROTT2箱形图地图动画)程序设计(程序) 演播室斯威夫特乳胶SQL日食吉特哈多普刮网)统计 回归主成分分析时间序列交易还有更多…



如果你走这么远,为什么不 订阅更新 从站点?选择您的口味: 电子邮件推特1188bet app,或 脸谱网

注释已关闭。

搜索R-Blo188bet appggers


赞助商

千万不要错过更新!
订阅R-Bloggers188bet app接收
最新R帖子的电子邮件。
(您将不再看到此消息。)

单击此处关闭(此弹出窗口将不再出现)