Shiny本地網(wǎng)頁部署與實現(xiàn)

Shiny是R里面一個非常出名的包颂翼,有了它,可以用R語言方便開發(fā)交互式web應用慨灭。Shiny程序是個簡單的目錄朦乏,里面包括前端頁面腳本ui.R、服務端腳本server.R以及起支持作用的其他數(shù)據(jù)氧骤、腳本和資源呻疹。當然也可以將ui.Rserver.R整合為一個app.R腳本。Shiny程序的運行可在R窗口放置前后端腳本的工作目錄下運行runApp()或者在命令行終端窗口或者控制臺窗口筹陵,執(zhí)行命令:R -e "shiny::runApp()"刽锤。

shiny dashboard是一個shiny的框架包,shiny中的頁面布局相對較為繁瑣,而shinydashboard則更加友好朦佩,容易上手并思。shinydashboard示意圖如下:

shiny dashboard

shiny dashboard網(wǎng)頁框架結構如下:

dashboardPage( # 總函數(shù)。
dashboardHeader(), # 標題欄
dashboardSidebar(), # 側邊欄
dashboardBody() # 主體
)

上面主要大體介紹了Shiny以及shiny dashboard的結構语稠,下面步入正題宋彼;假如生成Shiny網(wǎng)頁弄砍,怎樣部署形成本地html呢?我們知道shiny是一個交互式的web應用输涕,但有時如果基于成本或者某些特定的需求音婶,我們并不想將Shiny應用程序部署到服務器,如某些項目的測序數(shù)據(jù)分析結項report,或者只想搭建本地html,發(fā)送給客戶直接觀看莱坎,對于未安裝R客戶訪問shiny的頁面衣式,該怎么實現(xiàn)呢?

基于這個問題檐什,我試了好幾種辦法碴卧,分別介紹如下:

1. 利用R markdown生成html報告

Compiling a report template to PDF/HTML/Word,

如上圖所示,但對于這種格式的報告厢汹,更適合于代碼過程記錄展現(xiàn)螟深,不方便于客戶直接閱讀,如下圖所示(來源于Shiny example):
markdown

2. Shiny部署到Shiny Server或者shinyapps.io

這種主要是基于將Shiny應用部署到個人服務器上供訪問或者部署到shinyapps.io(Host your Shiny apps on the web in minutes with Shinyapps.io. It is easy to use, secure, and scalable. No hardware, installation, or annual purchase contract required. Free and paid options available.)烫葬,但由于我們的目標是想形成本地html界弧,因此暫不考慮公開部署。

3. Windows本地封裝打包部署

本部分參考Lee Pang的建議搭综,主要過程如下:

  • 部署基本框架:Shiny的運行需要R環(huán)境垢箕,瀏覽器以及腳本,因此封裝需要R-Portable,GoogleChromePortable,以及前端頁面腳本ui.R和服務端腳本server.R(或者整合為一個的app.R)兑巾。
    因此首先下載R-PortableGoogleChromePortable
    1)R Portable
    2)Google Chrome Portable

新建文件夾test,將上述兩個工具裝到test文件夾下条获,同時此目錄下新建shiny文件夾,將shiny需要運行的腳本app.R以及腳本所需的資源文件夾www一起放入到shiny文件夾下蒋歌,目前test文件夾下結構如下:

test文件夾

  • 安裝shiny腳本需要的依賴包:
    將以下代碼添加到 test文件夾下的R-Portable/App/R-Portable/etc/Rprofile.site文件末尾中:
.First = function(){
.libPaths(.Library)
}

原因:目的為了將shiny所依賴的包安裝到R-Portable中帅掘,而不影響原來系統(tǒng)R軟件所裝載的包;
然后打開 R-Portable堂油,安裝你的shiny程序所依賴的包:

.libPaths() #檢測上面設置的R-Portable的Library是否可用
install.packages('shiny')
install.packages('shinydashboard')
install.packages('ggplot2')
  • 創(chuàng)建運行shiny的程序:
    1) 創(chuàng)建一個程序runShinyApp.R運行shiny程序app.R
    該程序主要實現(xiàn)以下幾點:
    --- 設置 .libPaths() 指向本地的R-Portable library庫
    --- 設置shiny運行打開的瀏覽器為本地安裝的GoogleChromePortable
    --- 運行shiny腳本app.R, runApp()
    因此修档,runShinyApp.R 該程序的主要內容如下:
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)

2) 創(chuàng)建shell腳本運行
創(chuàng)建run.vbs文件windows下直接雙擊即可調用以上程序實現(xiàn)界面展示,run.vbs內容如下:

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

目前test文件夾下結構如下:

test文件夾

以上操作完成了基本shiny本地的框架府框,下面我們運行程序進行測試,測試之前迫靖,請將如下代碼添加到shiny程序的服務器端腳本server.R中,這樣做的目的保證了如果shiny::runApp()運行后網(wǎng)頁關閉系宜,則程序停止運行。

shinyServer(function(input, output, session){
    session$onSessionEnded(function() {
        stopApp()
})
})

bingo! 部署完成盹牧,雙擊run.vbs ,正常情況下會打開shiny的網(wǎng)頁展示实抡,跟在R中運行顯示的一樣欠母,如果沒有顯示,請檢查ShinyApp.log赏淌。

最簡單的方式,如果想將此本地shiny發(fā)送給客戶六水,則直接打包zip test文件夾,發(fā)送給客戶后解壓unzip辣卒,雙擊run.vbs即可掷贾。
當然更專業(yè)點,可以生成可執(zhí)行的安裝文件荣茫,發(fā)送給客戶直接安裝便可運行想帅,可以使用InnoSetup工具生成可執(zhí)行的.exe文件啡莉。InnoSetup的使用也比較簡單,在這里就不講了咧欣,需要的可自行查閱。

最后魄咕,shiny是R開發(fā)交互式web應用的包,其在交互式數(shù)據(jù)展示上比較容易上手毛萌,但是對于本地html的實現(xiàn),雖然上述操作可以達到目的喝滞,但是我們也發(fā)現(xiàn)其封裝了R-PortableGoogleChromePortable等shiny運行需要的環(huán)境,因此整個最終結果文件比較大,基于這個缺陷荔睹,Python的網(wǎng)頁開發(fā)著實是一種很好的優(yōu)勢展現(xiàn),需要接下來去研究使用僻他。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市满哪,隨后出現(xiàn)的幾起案子婿斥,更是在濱河造成了極大的恐慌哨鸭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件活鹰,死亡現(xiàn)場離奇詭異,居然都是意外死亡志群,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門锌云,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吁脱,“玉大人,你說我怎么就攤上這事豫喧。” “怎么了紧显?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涉兽。 經(jīng)常有香客問我,道長篙程,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任拥诡,我火速辦了婚禮,結果婚禮上渴肉,老公的妹妹穿的比我還像新娘爽冕。我一直安慰自己仇祭,他們只是感情好颈畸,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布乌奇。 她就那樣靜靜地躺著,像睡著了一般礁苗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寂屏,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天迁霎,我揣著相機與錄音吱抚,去河邊找鬼考廉。 笑死秘豹,一個胖子當著我的面吹牛,可吹牛的內容都是我干的既绕。 我是一名探鬼主播涮坐,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袱讹!你這毒婦竟也來了?” 一聲冷哼從身側響起捷雕,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎救巷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浦译,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年帽哑,在試婚紗的時候發(fā)現(xiàn)自己被綠了渤弛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甚带。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡她肯,死狀恐怖,靈堂內的尸體忽然破棺而出晴氨,到底是詐尸還是另有隱情,我是刑警寧澤籽前,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站肄梨,受9級特大地震影響,放射性物質發(fā)生泄漏众羡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一粱侣、第九天 我趴在偏房一處隱蔽的房頂上張望蓖宦。 院中可真熱鬧齐婴,春花似錦稠茂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽共螺。三九已至,卻和暖如春藐不,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雏蛮。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工挑秉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留法梯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓夜惭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诈茧。 傳聞我的和親對象是個殘疾皇子捂掰,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容