服务器部署简介

之前学过一点点R shiny,但只是自己随便在本地R中试用,没试过部署服务器。最近老板要我写个小工具供用户使用,没搞过,头有点大。

一般地,可将shiny部署在shinyapps.io上,适合小工具,但免费数量有限,国外服务器访问慢,不宜公开部署。

部署示例代码:

####===========部署在shinyapps.io上============
# install.packages('rsconnect')
library(rsconnect) #新增token
rsconnect::setAccountInfo(name='testtools',
token='D244566F2D704DE8FA3F558B556D835B',
secret='/SmfgeahhjGdKczf8VZUaKRfYnsEjekEm92') setwd("./")
#试运行
shiny::runApp()
#部署
deployApp()
#部署完成自动弹出网页,名称是app.R的目录名

shinyapps.io部署可参考:

shinyapp 部署的两种方法

shinydashboard系列六:部署与加密

二是可以将shiny部署在本地的服务器或者云服务器上。通常的操作是在ubuntu或centos系统上安装R及Rstudio-server,然后再进行IP地址和端口的配置,但前提是需要root权限安装(Rstudio-server一般是root安装,创建普通新用户登录)。关于本地服务器部署可参考教程:

在服务器中使用R--RStudio Server

服务器上搭shinyApp:shiny-server配置及报错解决

Rstudio-server的安装与使用

如何使用Shiny Server部署R应用程序

安装R Shiny Server

windows打包部署

另一种方法就是将脚本及其依赖的所有文件和环境打包,利用工具封装部署在本地。

具体过程参考Lee Pang的建议,如下:

1. 部署基本框架

Shiny的运行需要R环境,浏览器以及脚本,因此封装需要R-Portable,GoogleChromePortable,以及前端页面脚本ui.R和服务端脚本server.R(或者整合为一个的app.R)。

下载R PortableGoogle Chrome Portable

新建文件夹test,将上述两个工具安装到test文件夹下,同时此目录下新建shiny文件夹,将shiny需要运行的脚本app.R以及脚本所需的资源文件夹www一起放入到shiny文件夹下,目前test文件夹下结构如下:

2.安装shiny脚本需要的依赖包

将以下代码添加到 test文件夹下的R-Portable/App/R-Portable/etc/Rprofile.site文件末尾中,目的为了将shiny所依赖的包安装到R-Portable的library中,而不影响原来系统R软件所安载的包。

.First = function(){
.libPaths(.Library)
}

打开 R-Portable.exe,安装shiny程序所依赖的包。安装后的包在R-Portable/library下:

.libPaths() #检测上面设置的R-Portable的Library是否可用
install.packages('shiny')
install.packages('shinydashboard')
install.packages('ggplot2')

3.创建运行shiny的程序

首先,创建一个名为runShinyApp.R的脚本,目的是:

  • 设置 .libPaths() 指向本地的R-Portable library库
  • 设置shiny运行打开的浏览器为本地安装的GoogleChromePortable
  • 运行shiny脚本app.R, runApp()
message('library paths:\n', paste('... ', .libPaths(), sep='', collapse='\n'))

chrome.portable = file.path(getwd(),
'GoogleChromePortable/App/Chrome-bin/chrome.exe') launch.browser = function(appUrl, browser.path=chrome.portable) {
message('Browser path: ', browser.path)
shell(sprintf('"%s" --app=%s', browser.path, appUrl))
} shiny::runApp('./shiny/', launch.browser=launch.browser)

然后,再创建一个名为run.vbs的shell脚本运行runShinyApp.R,内容如下:

Rexe           = "R-Portable\App\R-Portable\bin\Rscript.exe"
Ropts = "--no-save --no-environ --no-init-file --no-restore --no-Rconsole"
RScriptFile = "runShinyApp.R"
Outfile = "ShinyApp.log"
strCommand = Rexe & " " & Ropts & " " & RScriptFile & " 1> " & Outfile & " 2>&1" intWindowStyle = 0 ' Hide the window and activate another window.'
bWaitOnReturn = False ' continue running script after launching R ' ' the following is a Sub call, so no parentheses around arguments'
CreateObject("Wscript.Shell").Run strCommand, intWindowStyle, bWaitOnReturn

在windows中直接双击run.vbs即可调用以上程序实现界面展示。

最后,我们需要加如下一段代码到shiny程序的服务器端脚本server.R(或者app.R的server函数的结尾)中,目的是保证如果shiny::runApp()运行后网页关闭,则程序停止运行。

shinyServer(function(input, output, session){
session$onSessionEnded(function() {
stopApp()
})
})

以上操作完成了基本shiny本地的框架,test文件夹结构如下:



双击run.vbs ,正常情况下会打开shiny的网页展示,跟在R中运行显示的一样,如果没有显示,请检查ShinyApp.log。

如果想将此本地shiny发送给客户,则直接打包test文件夹,发送给客户后解压双击run.vbs即可,不过这样的文件比较大(通常上百兆),而且泄露了源码。

也可以制作安装包,使用InnoSetup工具生成可执行的.exe文件。

以上主要参考了Shiny本地网页部署与实现教程,感谢作者。

【报错解决】无法定位程序输入点EXTPTE_PTR于动态链接库

直接运行时,可能会遇到无法定位程序输入点EXTPTE_PTR于动态链接库的报错,这是Rcpp的版本错误,参考这个答案:https://blog.csdn.net/weixin_42815846/article/details/106972453

,重新安装R(但我已经是最新版本的R4.0.2了),不行。在评论中找到解决方法,即把我另一台电脑上的R3.6.1的Rcpp中的Rcpp.dll复制过来覆盖掉R-Portable library库中的Rcpp.dll。这个文件的路径在library\Rcpp\libs\x64文件夹下。

将小工具打包成exe可执行文件

先用InnoSetup试了下,但制作安装包的过程是必需有exe文件的,vbs文件加载不了。

主要参考这2篇:

Inno Setup生成安装包

Inno Setup打包教程

于是考虑直接将vbs文件转换为exe文件。网上查了下,先用vbsedit试了下,参考这个教程:VBS如何编译成exe文件 vbsedit如何使用,成功转换了,也可以调用,但个人觉得这个软件比较大,配置也不友好,不推荐。

试了下另一款软件vbs to exe,教程参考:VBS转化为exe可执行文件,使用非常简单。

将run.vbs转换为run.exe后,我再试着用Inno Setup将它打包成setup安装文件,成功了,但安装后还是调用不了run.exe,遂放弃安装模式。

R shiny 小工具Windows本地打包部署的更多相关文章

  1. [原创] Delphi小工具(Windows资源管理器右键菜单扩展)

    两个小工具 1. 项目临时文件清理 2. Android Ndk 编译 c/c++ jni 源码工具. 下载后,点击Reg.bat就可以完成注册安装.不需要时点击 UnReg.Bat 就可以删除菜单. ...

  2. Chrome 小工具: 启动本地应用 (Native messaging)

    最近遇到一个新的问题.需要使用Chrome 插件, 从我们对我们当地的一个网站之一启动C#应用,同时通过本申请值执行不同的操作. 在这里记录下解决的过程.以便以后查找 首先我们须要新建一个google ...

  3. 【前端工具】seajs打包部署工具spm的使用总结

    相信使用seajs的好处大家都是知道的,接触seajs好像是在半年前,当时还不知道页面阻塞问题,这里不带多余的话了. seajs实现了模块化的开发,一个网站如果分了很多很多模块的话,等开发完成了,发现 ...

  4. Windows实用小工具–Windows远程协助

    在企业里,有的公司办公区域比较大,电脑有问题一般都是通过远程.徒步.电话等方式来解决,对于远程协助解决问题,我们首先想到的会是如何连接对方的电脑,相信大家都已经使用过很多的软件了吧!当然还有Micro ...

  5. Jenkins:用maven在本地打包部署一个github的springboot项目(Jenkins 2.257)

    一,部署的准备工作 1,测试项目的地址: https://github.com/liuhongdi/profile 是一个空白项目 2,准备java环境:参见: https://www.cnblogs ...

  6. 分享一个WPF 实现 Windows 软件快捷小工具

    分享一个WPF 实现 Windows 软件快捷小工具 Windows 软件快捷小工具 作者:WPFDevelopersOrg 原文链接:https://github.com/WPFDevelopers ...

  7. 解放双手 | Jenkins + gitlab + maven 自动打包部署项目

    前言 记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程! 需求背景 不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运 ...

  8. SpringBoot使用Maven插件打包部署

    [问题] 之前一直用SpringBoot做一些小项目,想打包部署在环境上,总是少依赖包jar.百度下可以通过Spring Boot Maven plugin插件,把Maven配置的依赖包都打到项目包里 ...

  9. 2014年Windows平台软件推荐:神器小工具(骨灰级

    原文  http://www.wtoutiao.com/a/120621.html 底层工具 “If you know how to use Process Monitor competently, ...

随机推荐

  1. 深入理解xLua基于IL代码注入的热更新原理

    目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...

  2. ip_local_port_range 和 ip_local_reserved_ports

    问题:启动应用程序时,发现网络端口被占用,原因是什么?如何避免? 原因:Linux 系统设置了随机使用的端口范围  echo "40000  60000" > /proc/. ...

  3. 基于屏幕空间的实时全局光照(Real-time Global Illumination Based On Screen Space)

    目录 Reflective Shadow Maps(RSM) RSM 的重要性采样 RSM 的应用与缺陷 Screen Space Ambient Occulsion(SSAO) SSAO Blur ...

  4. Luogu P2982 [USACO10FEB]慢下来 Slowing down | dfs序、线段树

    题目链接 题目大意: 有一棵N个结点树和N头奶牛,一开始所有奶牛都在一号结点,奶牛们将按从编号1到编号N的顺序依次前往自己的目的地,求每头奶牛在去往自己目的地的途中将会经过多少已经有奶牛的结点. 题解 ...

  5. 第04课 OpenGL 旋转

    旋转: 在这一课里,我将教会你如何旋转三角形和四边形.左图中的三角形沿Y轴旋转,四边形沿着X轴旋转. 上一课中我教给您三角形和四边形的着色.这一课我将教您如何将这些彩色对象绕着坐标轴旋转.其实只需在上 ...

  6. poj 1330 Nearest Common Ancestors (最简单的LCA)

    题意: 给出一棵树的结构. 给出两个点X和Y,求它俩的LCA. 思路: 只需求两个点的LCA,用了两种方法,一种离线tarjan,一种直接搞. 看代码. 代码: 方法一:直接搞. int const ...

  7. fork函数详解(附代码)

    虽然篇幅很长,但大多是易懂的代码,不用担心看不完 这里的所有操作,都将在下面的代码中有所体现 fork会拷贝当前进程的内存,并创建一个新的进程.如上图,fork函数会将整个进程的内存镜像拷贝到新的内存 ...

  8. 第一篇:《Kubernetes 入门介绍》

    前言:本文是一篇 kubernetes(下文用 k8s 代替)的入门文章,将会涉及 k8s 的技术历史背景.架构.集群搭建.一个 Redis 的例子,以及如何使用 operator-sdk 开发 op ...

  9. 一文带你理解TDengine中的缓存技术

    作者 | 王明明,涛思数据软件工程师 小 T 导读:在计算机系统中,缓存是一种常用的技术,既有硬件缓存,比如我们经常听到的 CPU L2 高速缓存,也有软件缓存,比如很多系统里把 Redis 当做数据 ...

  10. Python基础(slice切片)

    l = ['傻狗1','傻狗2','傻狗3','傻狗4','傻狗5','傻狗6'] print(l[0:3])#['傻狗1', '傻狗2', '傻狗3'] numbers = list(range(1 ...