部署R Shiny App时的便携式浏览器问题



我已经构建了一个复杂的Shiny界面,它从内部联网的ODBC表中提取数据,并允许用户通过浏览器与数据进行交互。该公司使用的是Windows 7企业版,IT部门只支持IE 9。一些用户在他们的用户文件夹中安装了chrome,一些用户安装了firefox,一些用户使用ie9。我遵循了R-Bloggers的教程(网址:http://www.r-bloggers.com/deploying-desktop-apps-with-r/),它在我的机器上运行,使用的是从PortableApps.com下载的便携式Chrome浏览器。太好了。不幸的是,这个界面并没有在任何安装了本地Chrome浏览器的机器上启动。

在本教程中,我使用了以下vb脚本:

Rexe           = "R-PortableAppR-PortablebinRscript.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   '
CreateObject("Wscript.Shell").Run strCommand, intWindowStyle, bWaitOnReturn
这个脚本调用我的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)

它在我的电脑上工作得很好…我确实在本地安装了chrome,但我正在调用便携式chrome可执行文件。这让我担心,这两个共享首选项或其他东西,例如,我注意到,从我的安装版本的首选项文件的哈希值,特别是:

  "chrome_url_overrides": {
     "bookmarks": [ "chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html" ]
  },

…与来自便携式Chrome安装的相同json条目匹配:

  "chrome_url_overrides": {
     "bookmarks": [ "chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html" ]
  }

为什么这些长随机字符串匹配?我想这个问题是不是找错对象了?我不知道为什么这些字符串匹配,如果他们是两个单独安装的Chrome可执行文件,其中一个应该完全独立于机器上的任何东西运行。

这是一组来自一台机器的错误:

.../Desktop/TestApp3/GoogleChromePortable/App/Chrome-bin/chrome.exe[9100:9408:0716/141934:ERROR:gpu_info_collector_win.cc(103)] Can't retrieve a valid WinSAT assessment.
[9100:9408:0716/141934:ERROR:component_loader.cc(138)] Failed to parse extension manifest.
[9100:1716:0716/141946:ERROR:get_updates_processor.cc(214)] PostClientToServerMessage() failed during GetUpdates

下面是另一台机器的错误:

.../Documents/TestApp3/GoogleChromePortable/App/Chrome-bin/chrome.exe
[5220:3384:0714/142128:ERROR:component_loader.cc(138)] Failed to parse extension     manifest.
[5220:7600:0714/142130:ERROR:external_registry_loader_win.cc(136)] File C:Program     FilesCoupons.com CouponBarchromeCoupons.com.crx for key     
SoftwareGoogleChromeExtensionscnpkmcjgpcihgfnkcjapiaabbbplkcmf does not exist or is not readable.
[5220:2120:0714/142140:ERROR:get_updates_processor.cc(214)] PostClientToServerMessage() failed during GetUpdates
[5220:3384:0714/142413:ERROR:CONSOLE(122)] "Could not find value for secondaryUser", source: chrome://resources/js/load_time_data.js (122)
[5220:3384:0714/142413:ERROR:CONSOLE(122)] "[undefined] (secondaryUser) is not a boolean", source: chrome://resources/js/load_time_data.js (122)
[5220:3384:0714/142425:ERROR:CONSOLE(122)] "Could not find value for secondaryUser", source: chrome://resources/js/load_time_data.js (122)
[5220:3384:0714/142425:ERROR:CONSOLE(122)] "[undefined] (secondaryUser) is not a boolean", source: chrome://resources/js/load_time_data.js (122)
[5220:3384:0714/142442:ERROR:navigation_entry_screenshot_manager.cc(167)] Invalid entry with unique id: 12

似乎Chrome在不同的电脑上做不同的事情,实际上并不是作为一个独立的浏览器…但很可能通过注册表或其他一些"幕后的、活跃的"通信与安装在各自计算机上的浏览器进行交互。也许,因为我在我的机器上安装了可移植的可执行文件,一堆我的本地扩展或首选项被自动更新为可移植的首选项等,随后这导致了其他机器上的冲突??

我可以关闭Chrome的扩展或额外的功能,如调用更新程序?是否有更好的独立便携式浏览器,可以很好地与Shiny一起用于这种"部署"目的?我能解决这个问题吗,还是注定要失败?这应该是显而易见的,但我还是要说:要求非技术类型的人安装R,然后安装RStudio,然后确认他们的工作目录结构,然后通过脚本窗口调用runApp()命令,这绝对不是经济有效的…

我从那些相同的文章开始,但是开发了RInno包来解决这个确切的问题,例如,当你想与非技术用户分享你的桌面Shiny应用程序时,他们不能指望在所有这些细节上搞砸。

开始:

install.packages("RInno")
require(RInno)
RInno::install_inno()
你只需要调用两个函数来创建一个安装框架:
create_app(app_name = "myapp", app_dir = "path/to/myapp")
compile_iss()

这将创建一个像其他程序一样运行的安装向导,但是会在Windows桌面计算机上安装你的闪亮应用程序。如果您想为没有安装R的同事包括R,请将include_R = TRUE添加到create_app:

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

默认包含shiny, magritr和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

最新更新