2015-06-21 9 views
6

Sto cercando di creare un'applicazione desktop lucido seguendo le istruzioni di questo molto bello post (http://www.r-bloggers.com/deploying-desktop-apps-with-r/)La creazione di stand-alone lucido App - Chrome errore

Quindi, fondamentalmente Ho una cartella con la seguente struttura:

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

Sto creando 2 versioni diverse, una con GoogleChromePortable e una senza. Entrambe le versioni sono identiche a parte il percorso per Chrome in 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) 

L'applicazione è lanciata attraverso un file .bat o .vbs che sono fondamentalmente la stessa, ma per il fatto che il primo lascia una finestra del prompt dei Comandante aperta.

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 

Problema:

Il problema che sto avendo è che compare in entrambe le versioni ed è la seguente.

Se ho il mio normale Chrome lanciato (NON la versione portatile) installato sul mio sistema, l'app lucida si avvia senza problemi. Apre una nuova finestra contenente interamente solo l'app lucida.

Tuttavia, se faccio non una sessione di Chrome aperta (quella predefinita), nessuna delle versioni di lucido sembra funzionare. Si apre una finestra ma carica per sempre. Guardando i registri creati, ottengo il seguente errore:

[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 

Qualsiasi idea di quello che sembra essere il problema qui?

+0

non ho mai visto questo metodo di distribuzione di applicazioni lucide. Sai che puoi usare shinyapps.io o semplicemente usare il tuo server lucido, giusto? Ospitare il tuo server lucido è molto semplice, ho un bel set di istruzioni se hai bisogno di –

+0

Grazie per il tuo commento. Sono a conoscenza degli altri modi di implementazione Shiny. Tuttavia, per il nostro progetto vorremmo anche condividere l'app lucida con gli altri in modo che possano usare la propria potenza di elaborazione del laptop, ma senza la necessità di installare nulla. – Ewoud

+0

@daattali puoi pubblicare o collegare queste istruzioni? –

risposta

5

ho risolto in questo modo con alcune modifiche al run.vbs e 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 

ho aggiunto la variabile startChrome e chiamano CreateObjectdopo comincio il server, perché altrimenti non c'è sito e Chrome non ricarica automaticamente quando si avvia in seguito . Solitamente avviare il server dovrebbe essere abbastanza veloce, ma se si utilizza una macchina molto lenta potrebbe richiedere troppo tempo. Quindi è necessario aggiungere un ritardo tra le due chiamate CreateObject.

L'impostazione --app apre l'app in una finestra che non ha tutti i pulsanti di Google Chrome e quindi sembra davvero un'app standalone.

runShinyApp.R:

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

Port 7777 è arbitrario, è possibile utilizzare qualsiasi porta gratuito ti piace. La porta deve essere uguale in tutti i file.

Nel caso in cui si desidera utilizzare un pipistrello di file:

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

Grazie molto! Questa soluzione funziona alla grande! – Ewoud

+0

Verena, hai provato il tuo codice in un Mac o potresti indicarmi una risorsa che può essere utile per sviluppare un'utilità standalone per un Mac che usi lo stesso? – bonCodigo

+1

@bonCodigo Per quanto ne so R Portable è in esecuzione solo su Windows. Almeno quando ho fatto questo progetto era possibile farlo solo su Windows. Mi piacerebbe vederlo funzionare anche su Linux o Mac! Se trovi una versione R portatile per Mac, dovrebbe essere possibile seguire la stessa procedura. –

3

mi sono trasferita lontano da utilizzando la versione portatile di Chrome a causa di problemi come questo, mentre lo sviluppo del pacchetto RInno, che si basa su Dr. Il framework DesktopDeployR di Lee Pang. Il pacchetto aiuta ad automatizzare questo e incorpora i programmi di installazione di Inno Setup in modo che gli utenti non tecnici possano installare e utilizzare le tue app Shiny.

per iniziare:

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

Poi basta chiamare due funzioni per creare un quadro di installazione:

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

Se si desidera includere R per i vostri collaboratori che don 't averlo installato, aggiungere include_R = TRUE a create_app:

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

Per impostazione predefinita include lucido, magrittr e jsonlite, quindi se si utilizzano altri pacchetti come ggplot2 o plotly, è sufficiente aggiungerli all'argomento pkgs. È inoltre possibile includere pacchetti GitHub per l'argomento remotes:

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

Se siete interessati ad altre caratteristiche, controlla FI Labs - RInno

+0

Posso ancora eseguire il "full" standalone con RInno utilizzando ChromePortable o qualcosa di simile (almeno una nuova finestra del browser senza barre)? Se é cosi, come? – trybik

+0

Non ancora, ma questo è un grande suggerimento. Sentiti libero di inviare una richiesta di funzionalità a https://github.com/ficonsulting/RInno/issues –

+0

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