• 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,遂放弃安装模式。

  • 相关阅读:
    写一写这几天安卓开发遇到的坑
    安卓环境搭建
    正则表达式
    一段时间的总结
    路飞-登录页面
    路飞-腾讯云短信接口
    路飞-Redis
    路飞-git操作
    路飞-后台xadmin配置
    路飞-后台处理跨域问题
  • 原文地址:https://www.cnblogs.com/jessepeng/p/13817858.html
Copyright © 2020-2023  润新知