创建独立的闪亮应用程序 - Chrome 错误

Creating stand-alone Shiny App - Chrome Error

我正在尝试按照这个非常好的博客的说明创建一个闪亮的桌面应用程序 post (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 个不同的版本,一个带有 GoogleChrome便携版,一个没有。除了 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 文件启动,这两个文件基本相同,但第一个文件打开了指挥官提示 window。

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 启动(不是便携式版本),闪亮的应用程序启动时没有任何问题。它会打开一个新的 window,完全只包含闪亮的应用程序。

但是,如果我 没有 打开 Chrome 会话(默认会话),那么 shiny 的两个版本似乎都不起作用。 window 打开但永远加载。 查看创建的日志,出现以下错误:

[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

知道这里的问题是什么吗?

我通过对 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 按钮的 window 中打开应用程序,然后它看起来真的像一个独立的应用程序。

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

由于在开发基于 Dr. 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