问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

【R语言】一个Shiny应用模块化的实例

发布网友 发布时间:2024-10-07 10:39

我来回答

1个回答

热心网友 时间:2024-10-22 05:15

Shiny简介

Shiny是由Posit公司开发的双语言扩展包(包括R和Python),可视为基于R/Python的交互式应用程序开发平台,能够构建各式各样的Web应用程序。在官网上可以浏览众多实例。Shiny最出色的特点是它将众多的基础工具集成到一个高级语言环境,使用户同时具备构建前后端程序的能力。

起初的Shiny已能够支持大型Web程序的开发(实际上官网也是用Shiny构建的),但开发者注意到Shiny有必要在基础的UI和Server架构下新增模块化功能,否则随着程序功能的增加,代码管理也将愈发困难。为此,模块(Mole)在2016年首次被引入Shiny,用于将大量重复代码包装成模块,以便于移植和开发。

提示:继续阅读本文内容需要理解Shiny的最基础架构,如需了解,请移步官网教程。

Shiny模块简介

通过Shiny模块,我们可以将Shiny程序进行模块化,以下是一个示意图:

为了方便描述,以下将未模块化的Shiny应用程序称为集中式App。在这个简单的示意图中,我们虚拟一个集中式App,其中包含三个页面(Tab 1、Tab 2、Tab 3),每一个页面包含了相同的一段UI代码,且对应了一段相同的Server代码。因此,为了同时更改这三个页面的代码,我们可以将重复的UI封装成一个UI模块,再让三个页面调用模块,以此实现重复代码的缩减(server同理),构建一个模块化App。简而言之,Shiny模块本质上是一种自定义函数。

需要注意的是,server端的模块化是2020年后新增的功能,如果你之前了解的Shiny模块没有关于server端的部分,建议先去阅读最新的教学材料。

Shiny模块化实例一个集中式App

这里我们根据官网示例Shiny theme selector来构建前面示意图中集中式App的实例,代码如下:

ui.R

server.R

global.R

App的主目录结构如下:

运行程序之后我们可以发现只有Navbar 1中的Tab 1是有内容的,而Tab 2和3是空的:

Tab1的功能很简单,就是将Slider input的数字乘以10倍,再把计算公式和结果打印出来。

一个新增功能需求

现在我们自行给出一个需求,那就是将Tab 1的功能复制到Tab 2里头,并且两者相互独立。

在集中式App中新增功能

按照需求描述,最简单的方式是把Tab 1和左侧的Slider input都复制一遍,并且定义为不同的对象,如下:

ui.R

server.R

此外,global.R和App的主目录结构维持不变。

运行之后,可以发现功能已经植入Tab 2,并且能正常使用:

在模块化App中新增功能

首先我们进行UI的模块化,将sliderInput包装成一个函数slider_mole(),并单独存成一个脚本slider_mole.R

slider_mole是一个自定义函数,开头必须要定义一个函数类对象ns,内容为NS(id),其后的所有input id字符串都要套上这个函数。例如"slider"需要变更为ns("slider")。

之后,我们进行Server的模块化,将renderText包装成一个函数print_number_mole(),并单独存成一个脚本print_number_mole.R

之后,将模块插入UI端和Server端:

ui.R

server.R

global.R

App的主目录结构如下:

观察ui.R和server.R可以发现,模块是通过id进行关联的,例如txtout是由print_number_mole("slider1")生成,而其输入为slider_mole("slider1")。

模块化的优点

这里我们先总结一下集中式App和模块化App的差异。

ui端的差异主要是各项input控件是否采用自定义的模块:

server端的差异主要是各项输出是否采用自定义的模块:

如果是模块化的App,global需要source模块函数,集中式app则不需要:

通过上述对比,我们可以发现模块化的优点是它解除了计算程序和IO的1v1绑定逻辑,意味着后续对程序的更改只要在模块内进行即可,不需要满世界找代码位置,也不需要重复修改相同的代码。举个例子,现在需要将实例中sliderInput给出的数字乘以10改为乘以100,则只要在模块中修改即可。相对的,如果不采用模块化的编程方式,我们需要定位slider1和slider2所在的位置,再对代码进行修改。

结语

本文是一个关于Shiny模块的简单介绍,对于Shiny用户而言,学习Shiny模块还是很有必要的,主要原因在于集中式App框架的内容承载量非常有限,在实践中,包含数个功能的App代码已经能让人感受到生理不适(亲身经验)。此外,Shiny模块还是构建企业级Shiny应用框架的基础(例如 golem和 rhino),如果你有意在工作中使用Shiny,Shiny模块将是绕不开的一项技术。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华硕X205TABIOS里launchcsm这个选项怎么找 朋友在一起,本来想着相互花钱不要计较那么多的,结果对方却老是想着比... 别人叫你请他吃东西,那他是不是不讨厌你。算是给你机会吗?? 哪种乌冬面比较好吃 ...膳,你小时候最爱吃那儿的豌豆黄儿。还记得那回我带你去北海吗... 苍梧鸟是什么意思? 右手五指受伤其中小指无名指各截掉一节可评几级伤残 ...桡骨骨折伤残鉴定怎么算呢,是左手的算左手的右手算右手,还是一起算... 工伤伤残鉴定中,对右手左手有区别吗? 车子出了事故,4s店在维修合同上写的交车日期,如果4s店超出预订时间交车... 北京人头盖骨之谜内容简介 ...就是QQ空间信息中心和我的邮箱打不开,浏览器是空白页是什么... 好久没看小说了,亲各位大大有什么好看的小说吗?经典的穿越文就不要了... 北风呼呼是什么季节 北风呼呼的季节是什么季节 北风呼呼是什么季节北风呼呼是什么季节的自然现象 北风呼呼哪个季节 生活记录——MongoDB 事务报错问题(Transaction code has been aborted... 超导可视无痛人流术超导可视无痛人流和无痛人流相比的优势 超导可视无痛人流术与传统人流、药流比较 超导可视无痛人流的危害 陈汝佳的歌曲,歌词是:自从你走了以后,我的心⋯ ...怎么才能看呢是不是要下载什么播放器啊拜托了各位 怎么用迅雷下载电影?下载完了后,又怎么转换格式传到读卡器上? 在 ...怎么弄就是放不出来,求解,这个录音对我非常重要,急急急 找一首歌词,融化了冰冻已久的心愿 问老歌的名字 每天的清晨 我渴望着新的开始 每天的夜深 我祈求着深的... 开设赌场罪涉及金额18万怎么判 开设赌场罪赌资18万怎么办 开设赌场罪获利18万怎么判 浦东电视台主持人介绍 符雅公姓氏来源 教师节老师我想对您说广播稿范文 我的脚背于6天前晦气被椅子砸了,后来去医院做磁供振,把片子拿给医生,医... 脚背骨裂前十天没有打石膏,后来才打,要多久拆 脚背没有错位的轻微骨裂多久能下地走路 脚踏空当时脚背肿痛并且脚趾骨裂没有上石膏现在76天走路还跛还是肿有... 脚被压伤了,脚背两个脚趾根部骨裂,现在两个月了,下床走路还是有点疼 ...拍了片子说第五骨头节骨裂!现在刚一个月不觉得疼了能打篮球去吗... 横着刷牙真的会损伤牙齿吗? 羊肉不能和红茶一起吃嘛 羊肉不能和茶叶、乳酪、西瓜一起吃吗? 治疗阴道炎的药 阴道炎的药有哪些 ...直立的人,而门缝里把人看扁了拜托各位了 3Q ...3G无线网卡是怎么扣费的啊,我的是每月100块3G流量, 电信天翼无线网卡 100元包月2G流量 已使用2200MB+。。。到底还有多少流... 无线上网卡资费套餐:我办理的是100元包月60小时,为什么我没用60小时... 我办了个电信的100元包月的上网卡套餐 本地1G流量国内2G 现在本地1G... 本人身高183体重220斤想问下去健身房训练的话一个月能瘦多少斤 符家主先是谁