服務(wù)器部署簡介
之前學(xué)過一點點R shiny烫罩,但只是自己隨便在本地R中試用樱调,沒試過部署服務(wù)器约素。最近老板要我寫個小工具供用戶使用,沒搞過笆凌,頭有點大圣猎。
一般地,可將shiny部署在shinyapps.io上乞而,適合小工具送悔,但免費數(shù)量有限,國外服務(wù)器訪問慢,不宜公開部署欠啤。
部署示例代碼:
####===========部署在shinyapps.io上============
# install.packages('rsconnect')
library(rsconnect)
#新增token
rsconnect::setAccountInfo(name='testtools',
token='D244566F2D704DE8FA3F558B556D835B',
secret='/SmfgeahhjGdKczf8VZUaKRfYnsEjekEm92')
setwd("./")
#試運行
shiny::runApp()
#部署
deployApp()
#部署完成自動彈出網(wǎng)頁荚藻,名稱是app.R的目錄名
shinyapps.io部署可參考:
二是可以將shiny部署在本地的服務(wù)器或者云服務(wù)器上。通常的操作是在ubuntu或centos系統(tǒng)上安裝R及Rstudio-server洁段,然后再進行IP地址和端口的配置应狱,但前提是需要root權(quán)限安裝(Rstudio-server一般是root安裝,創(chuàng)建普通新用戶登錄)祠丝。關(guān)于本地服務(wù)器部署可參考教程:
在服務(wù)器中使用R--RStudio Server
服務(wù)器上搭shinyApp:shiny-server配置及報錯解決
Rstudio-server的安裝與使用
如何使用Shiny Server部署R應(yīng)用程序
安裝R Shiny Server
windows打包部署
另一種方法就是將腳本及其依賴的所有文件和環(huán)境打包疾呻,利用工具封裝部署在本地。
具體過程參考Lee Pang的建議写半,如下:
1. 部署基本框架
Shiny的運行需要R環(huán)境岸蜗,瀏覽器以及腳本,因此封裝需要R-Portable,GoogleChromePortable,以及前端頁面腳本ui.R和服務(wù)端腳本server.R(或者整合為一個的app.R)污朽。
下載R Portable和Google Chrome Portable
新建文件夾test散吵,將上述兩個工具安裝到test文件夾下,同時此目錄下新建shiny文件夾蟆肆,將shiny需要運行的腳本app.R以及腳本所需的資源文件夾www一起放入到shiny文件夾下矾睦,目前test文件夾下結(jié)構(gòu)如下:
2.安裝shiny腳本需要的依賴包
將以下代碼添加到 test文件夾下的R-Portable/App/R-Portable/etc/Rprofile.site文件末尾中,目的為了將shiny所依賴的包安裝到R-Portable的library中炎功,而不影響原來系統(tǒng)R軟件所安載的包枚冗。
.First = function(){
.libPaths(.Library)
}
打開 R-Portable.exe,安裝shiny程序所依賴的包蛇损。安裝后的包在R-Portable/library下:
.libPaths() #檢測上面設(shè)置的R-Portable的Library是否可用
install.packages('shiny')
install.packages('shinydashboard')
install.packages('ggplot2')
3.創(chuàng)建運行shiny的程序
首先赁温,創(chuàng)建一個名為runShinyApp.R的腳本,目的是:
- 設(shè)置 .libPaths() 指向本地的R-Portable library庫
- 設(shè)置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)
然后淤齐,再創(chuàng)建一個名為run.vbs的shell腳本運行runShinyApp.R股囊,內(nèi)容如下:
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即可調(diào)用以上程序?qū)崿F(xiàn)界面展示。
最后更啄,我們需要加如下一段代碼到shiny程序的服務(wù)器端腳本server.R(或者app.R的server函數(shù)的結(jié)尾)中稚疹,目的是保證如果shiny::runApp()運行后網(wǎng)頁關(guān)閉,則程序停止運行祭务。
shinyServer(function(input, output, session){
session$onSessionEnded(function() {
stopApp()
})
})
以上操作完成了基本shiny本地的框架内狗,test文件夾結(jié)構(gòu)如下:
雙擊run.vbs ,正常情況下會打開shiny的網(wǎng)頁展示义锥,跟在R中運行顯示的一樣柳沙,如果沒有顯示,請檢查ShinyApp.log拌倍。
如果想將此本地shiny發(fā)送給客戶赂鲤,則直接打包test文件夾噪径,發(fā)送給客戶后解壓雙擊run.vbs即可,不過這樣的文件比較大(通常上百兆)蛤袒,而且泄露了源碼熄云。
也可以制作安裝包,使用InnoSetup工具生成可執(zhí)行的.exe文件妙真。
以上主要參考了Shiny本地網(wǎng)頁部署與實現(xiàn)教程缴允,感謝作者。
【報錯解決】無法定位程序輸入點EXTPTE_PTR于動態(tài)鏈接庫
直接運行時珍德,可能會遇到無法定位程序輸入點EXTPTE_PTR于動態(tài)鏈接庫
的報錯练般,這是Rcpp的版本錯誤,參考這個答案:https://blog.csdn.net/weixin_42815846/article/details/106972453
锈候,重新安裝R(但我已經(jīng)是最新版本的R4.0.2了)薄料,不行。在評論中找到解決方法泵琳,即把我另一臺電腦上的R3.6.1的Rcpp中的Rcpp.dll復(fù)制過來覆蓋掉R-Portable library庫中的Rcpp.dll摄职。這個文件的路徑在library\Rcpp\libs\x64
文件夾下。
將小工具打包成exe可執(zhí)行文件
先用InnoSetup試了下获列,但制作安裝包的過程是必需有exe文件的谷市,vbs文件加載不了。
主要參考這2篇:
Inno Setup生成安裝包
Inno Setup打包教程
于是考慮直接將vbs文件轉(zhuǎn)換為exe文件击孩。網(wǎng)上查了下迫悠,先用vbsedit試了下,參考這個教程:VBS如何編譯成exe文件 vbsedit如何使用巩梢,成功轉(zhuǎn)換了创泄,也可以調(diào)用,但個人覺得這個軟件比較大括蝠,配置也不友好鞠抑,不推薦。
試了下另一款軟件vbs to exe忌警,教程參考:VBS轉(zhuǎn)化為exe可執(zhí)行文件碍拆,使用非常簡單。
將run.vbs轉(zhuǎn)換為run.exe后慨蓝,我再試著用Inno Setup將它打包成setup安裝文件,成功了端幼,但安裝后還是調(diào)用不了run.exe礼烈,遂放棄安裝模式。