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:\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文件夾結構如下:
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。這個文件的路徑在library\Rcpp\libs\x64文件夾下。

將小工具打包成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,遂放棄安裝模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM