我正在尝试按照这篇非常好的博文(http://www.r-bloggers.com/deploying-desktop-apps-with-r/)的指示创建一个闪亮的桌面应用程序
所以基本上我有一个具有以下结构的文件夹:
App
|__ GoogleChromePortable
|__ App
|__ Data
|__ ...
|__ R Portable
|__ App
|__ Data
|__ ...
|__ shiny
|__ ui.R
|__ server.R
|__ ...
|__ LAUNCH.bat/LAUNCH.vbs
|__ runShinyApp.R
我正在创建2个不同版本,一个使用GoogleChromePortable而另一个没有。除runShinyApp.R
中的Chrome浏览器之外,这两个版本完全相同。
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
文件启动的,这些文件基本相同,但是第一个应用程序启用了Commander Prompt窗口。
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 :(得分:7)
我已经通过对 run.vbs 和 runShinyApp.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是任意的,您可以使用您喜欢的任何免费端口。所有文件中的端口必须相同。
如果您想使用 bat 文件:
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
答案 1 :(得分:4)
在开发基于Lee Pang博士的DesktopDeployR框架的RInno软件包时,我因为这样的问题而放弃使用便携版Chrome。该软件包有助于实现自动化,并集成了Inno Setup安装程序,以便非技术用户可以安装和使用您的Shiny应用程序。
开始使用:
install.packages("RInno")
require(RInno)
RInno::install_inno()
然后你只需要调用两个函数来创建一个安装框架:
create_app(app_name = "myapp", app_dir = "path/to/myapp")
compile_iss()
如果您希望为未安装R的同事添加R,请将include_R = TRUE
添加到create_app
:
create_app(app_name = "myapp", app_dir = "path/to/myapp", include_R = TRUE)
默认包含shiny,magrittr和jsonlite,因此如果您使用ggplot2或plotly等其他包,只需将它们添加到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