2015-06-21 100 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