R shiny 小工具Windows本地打包部署

服務(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部署可參考:

shinyapp 部署的兩種方法
shinydashboard系列六:部署與加密

二是可以將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 PortableGoogle Chrome Portable

新建文件夾test散吵,將上述兩個工具安裝到test文件夾下,同時此目錄下新建shiny文件夾蟆肆,將shiny需要運行的腳本app.R以及腳本所需的資源文件夾www一起放入到shiny文件夾下矾睦,目前test文件夾下結(jié)構(gòu)如下:


image.png

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')
image.png

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)如下:


image.png

雙擊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文件加載不了。

image.png

主要參考這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礼烈,遂放棄安裝模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婆跑,一起剝皮案震驚了整個濱河市此熬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖犀忱,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件募谎,死亡現(xiàn)場離奇詭異,居然都是意外死亡阴汇,警方通過查閱死者的電腦和手機数冬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搀庶,“玉大人拐纱,你說我怎么就攤上這事「缇螅” “怎么了秸架?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咆蒿。 經(jīng)常有香客問我东抹,道長,這世上最難降的妖魔是什么沃测? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任缭黔,我火速辦了婚禮,結(jié)果婚禮上芽突,老公的妹妹穿的比我還像新娘试浙。我一直安慰自己,他們只是感情好寞蚌,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布田巴。 她就那樣靜靜地躺著,像睡著了一般挟秤。 火紅的嫁衣襯著肌膚如雪壹哺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天艘刚,我揣著相機與錄音管宵,去河邊找鬼。 笑死攀甚,一個胖子當(dāng)著我的面吹牛箩朴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秋度,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炸庞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荚斯?” 一聲冷哼從身側(cè)響起埠居,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤查牌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后滥壕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纸颜,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年绎橘,在試婚紗的時候發(fā)現(xiàn)自己被綠了胁孙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡金踪,死狀恐怖浊洞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胡岔,我是刑警寧澤法希,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站靶瘸,受9級特大地震影響苫亦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怨咪,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一屋剑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诗眨,春花似錦唉匾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芋簿,卻和暖如春峡懈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背与斤。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工肪康, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撩穿。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓磷支,卻偏偏與公主長得像,于是被迫代替她去往敵國和親食寡。 傳聞我的和親對象是個殘疾皇子齐唆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354