Shiny本地網頁部署與實現

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

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

shiny dashboard

shiny dashboard網頁框架結構如下:

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

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

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

1. 利用R markdown生成html報告

Compiling a report template to PDF/HTML/Word,

如上圖所示,但對于這種格式的報告,更適合于代碼過程記錄展現,不方便于客戶直接閱讀,如下圖所示(來源于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環境,瀏覽器以及腳本,因此封裝需要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中,而不影響原來系統R軟件所裝載的包;
然后打開 R-Portable,安裝你的shiny程序所依賴的包:

.libPaths() #檢測上面設置的R-Portable的Library是否可用
install.packages('shiny')
install.packages('shinydashboard')
install.packages('ggplot2')
  • 創建運行shiny的程序:
    1) 創建一個程序runShinyApp.R運行shiny程序app.R
    該程序主要實現以下幾點:
    --- 設置 .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) 創建shell腳本運行
創建run.vbs文件windows下直接雙擊即可調用以上程序實現界面展示,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()運行后網頁關閉,則程序停止運行。

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

bingo! 部署完成,雙擊run.vbs ,正常情況下會打開shiny的網頁展示,跟在R中運行顯示的一樣,如果沒有顯示,請檢查ShinyApp.log

最簡單的方式,如果想將此本地shiny發送給客戶,則直接打包zip test文件夾,發送給客戶后解壓unzip,雙擊run.vbs即可。
當然更專業點,可以生成可執行的安裝文件,發送給客戶直接安裝便可運行,可以使用InnoSetup工具生成可執行的.exe文件。InnoSetup的使用也比較簡單,在這里就不講了,需要的可自行查閱。

最后,shiny是R開發交互式web應用的包,其在交互式數據展示上比較容易上手,但是對于本地html的實現,雖然上述操作可以達到目的,但是我們也發現其封裝了R-PortableGoogleChromePortable等shiny運行需要的環境,因此整個最終結果文件比較大,基于這個缺陷,Python的網頁開發著實是一種很好的優勢展現,需要接下來去研究使用。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容