zoukankan      html  css  js  c++  java
  • R shiny 小工具Windows本地打包部署

    服务器部署简介

    之前学过一点点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文件夹下结构如下:
    image.png

    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')
    

    image.png

    3.创建运行shiny的程序

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

    • 设置 .libPaths() 指向本地的R-Portable library库
    • 设置shiny运行打开的浏览器为本地安装的GoogleChromePortable
    • 运行shiny脚本app.R, runApp()
    message('library paths:
    ', paste('... ', .libPaths(), sep='', collapse='
    '))
    
    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-PortableAppR-PortableinRscript.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文件夹结构如下:
    image.png
    双击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。这个文件的路径在libraryRcpplibsx64文件夹下。

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

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

    image.png

    主要参考这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,遂放弃安装模式。

  • 相关阅读:
    [DB] 数据库的连接
    JS leetcode 翻转字符串里的单词 题解分析
    JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。
    JS leetcode 搜索插入位置 题解分析
    JS leetcode 杨辉三角Ⅱ 题解分析
    JS leetcode 寻找数组的中心索引 题解分析
    JS leetcode 移除元素 题解分析
    JS leetcode 最大连续1的个数 题解分析
    JS leetcode 两数之和 II
    JS leetcode 反转字符串 题解分析
  • 原文地址:https://www.cnblogs.com/jessepeng/p/13817858.html
Copyright © 2011-2022 走看看