2015-06-21 87 views
6

我想創建一個閃亮的桌面應用程序,這非常漂亮的博客文章(http://www.r-bloggers.com/deploying-desktop-apps-with-r/創建獨立的閃亮應用 - Chrome的錯誤

所以基本上我有以下結構的文件夾中的指令後:

App 
|__ GoogleChromePortable 
    |__ App 
    |__ Data 
    |__ ... 
|__ R Portable 
    |__ App 
    |__ Data 
    |__ ... 
|__ shiny 
    |__ ui.R 
    |__ server.R 
    |__ ... 
|__ LAUNCH.bat/LAUNCH.vbs 
|__ runShinyApp.R 

我正在創建2個不同的版本,一個使用GoogleChromePortable,另一個使用GoogleChromePortable,另一個不帶版本。除了Chrome的路徑runShinyApp.R之外,兩個版本都是完全一樣的。

runShinyApp.R

# checking if correct library paths are being used (only portable one!) 
message('library paths:\n', paste('... ', .libPaths(), sep='',  collapse='\n')) 

# both chromes work! 
chrome.sys = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe' 
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) 

的應用是通過.bat.vbs文件,該文件是基本相同的,但對於第一個離開指揮官提示符窗口打開的事實展開。

LAUNCH.bat

SET ROPTS=--no-save --no-environ --no-init-file --no-restore --no-Rconsole 
R-Portable\App\R-Portable\bin\Rscript.exe %ROPTS% runShinyApp.R 1> ShinyApp.log 2>&1 

LAUNCH.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 

問題:

我有正出現兩個版本,它是下列問題。

如果我在我的系統上安裝了正常的Chrome瀏覽器(不是便攜式版本),那麼閃亮的應用程序將毫無問題地啓動。它會打開一個完全只包含閃亮應用程序的新窗口。

但是,如果我做不是有一個Chrome會話打開(默認一個),這兩個版本的閃亮似乎工作。一個窗口打開,但永遠加載。 望着創建的日誌,我得到以下錯誤:

[4092:3596:0621/154834:ERROR:url_pattern_set.cc(240)] Invalid url pattern: chrome://print/* 
[4092:3596:0621/154834:ERROR:bluetooth_adapter_win.cc(102)] NOT IMPLEMENTED 

任何想法似乎是這裏的問題?

+0

我從來沒有看到閃亮的部署應用程序的這種方法。你知道你可以使用shinyapps.io或只使用你自己的閃亮服務器,對吧?託管你自己的閃亮服務器非常簡單,如果你需要,我有一套很好的說明 –

+0

謝謝你的評論。我知道Shiny部署的其他方式。然而,對於我們的項目,我們也希望與其他人分享閃亮的應用程序,以便他們可以使用自己的筆記本電腦處理能力,但仍然無需安裝任何東西。 – Ewoud

+0

@daattali能否發佈或鏈接這些說明? –

回答

5

我已經解決了這個問題,對run.vbsrunShinyApp.R進行了一些更改。

run.vbs:

Rexe   = "R-Portable\App\R-Portable\bin\R.exe CMD BATCH" 
Ropts   = "--no-save --no-environ --no-init-file --no-restore --no-Rconsole " 
RScriptFile = "runShinyApp.R" 
Outfile  = "ShinyApp.log" 
startChrome = "GoogleChromePortable\Chrome\chrome.exe --app=http://127.0.0.1:7777" 
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 
CreateObject("Wscript.Shell").Run startChrome, intWindowStyle, bWaitOnReturn 

我加入了startChrome變量,並調用CreateObject後,我啓動服務器,否則沒有網站和Chrome當你然後再啓動它不會自動重新加載。通常啓動服務器應該足夠快,但是如果您使用的是非常慢的機器,則可能需要很長時間。然後您需要在兩個CreateObject調用之間添加延遲。

--app設置在沒有所有Google Chrome按鈕的窗口中打開應用程序,然後它看起來像是獨立應用程序。

runShinyApp。R:

require(shiny) 
shiny::runApp('./shiny/',port=7777) 

端口7777是任意的,你可以使用任何你喜歡的免費端口。所有文件中的端口必須相同。

如果你想使用蝙蝠文件:

SET ROPTS=--no-save --no-environ --no-init-file --no-restore --no-Rconsole 
start /b GoogleChromePortable\Chrome\chrome.exe --app=http://127.0.0.1:7777 
R-Portable\App\R-Portable\bin\R.exe CMD BATCH %ROPTS% runShinyApp.R 1> ShinyAppOut.log 2> ShinyAppMsg.log 
+0

謝謝非常!此解決方案效果很好! – Ewoud

+0

Verena,您是否在Mac上試過您的代碼,或者您能否指出我可以使用相同的資源來開發Mac的獨立實用程序? – bonCodigo

+1

@bonCodigo據我所知,R Portable只能在Windows上運行。至少當我做這個項目時,它只能在Windows上完成。我很想看到它在Linux或Mac上的工作!如果您發現Mac版的便攜式R版,那麼應該可以按照相同的步驟進行操作。 –

3

我使用,因爲像這樣的問題的Chrome便攜版搬走而開發RInno包,這是基於對博士Lee Pang的DesktopDeployR框架。該軟件包有助於實現自動化,並整合了Inno Setup安裝程序,以便非技術用戶可以安裝和使用Shiny應用程序。

要開始:

install.packages("RInno") 
require(RInno) 
RInno::install_inno() 

然後你只需要調用兩個函數來創建一個安裝框架:

create_app(app_name = "myapp", app_dir = "path/to/myapp") 
compile_iss() 

如果你想:R表示你的同事誰不「T有它安裝,添加include_R = TRUEcreate_app

create_app(app_name = "myapp", app_dir = "path/to/myapp", include_R = TRUE) 

它默認包含閃亮,magrittr和jsonlite,所以如果您使用其他軟件包(如ggplot2)或繪圖,只需將它們添加到pkgs參數。您還可以包括GitHub的軟件包到remotes說法:

create_app(
    app_name = "myapp", 
    app_dir = "path/to/myapp" 
    pkgs  = c("shiny", "jsonlite", "magrittr", "plotly", "ggplot2"), 
    remotes = c("talgalili/installr", "daattali/shinyjs")) 

如果你有興趣在其他功能,請FI Labs - RInno

+0

我仍然可以使用ChromePortable或類似的東西(至少有一個新的瀏覽器窗口不帶任何酒吧)「完全」單獨使用RInno嗎?如果是這樣,怎麼樣? – trybik

+0

還沒有,但這是一個很好的建議。隨意提交功能請求https://github.com/ficonsulting/RInno/issues –

+0

完成:https://github.com/ficonsulting/RInno/issues/21 – trybik