Deploying a Shiny app as a desktop application with Electron
In developing the DSM2 HYDRO Viz Tool, we were faced with deciding how to deploy a Shiny app that required interaction with large local files. I first heard about the possibility of using Electron to deploy Shiny apps as standalone desktop applications in this talk by Katie Sasso, but it wasn’t until I discovered the R Shiny Electron (RSE) template that I decided to take the plunge.
UPDATE (2020-09-06): The approach described in this post is fragile and I no longer use it. Here are a couple of alternatives: electricShine and photon.
UPDATE (2020-11-28): I spent some time this weekend looking again at options for using Electron to deploy Shiny apps. My current conclusion is that it is more trouble than it is worth. Instead, I recommend DesktopDeployR as a simpler solution (Windows only). The end result is less slick than an Electron app, but involves much less hassle.
R Shiny Electron Build Process
The R Shiny Electron (RSE) template includes only very basic instructions for how to get started with this process (and they clearly specify that it is not ready for production). There were considerable gaps in my understanding that left me flailing while trying to get things to work (especially on Windows). Below I am describing what I did to get up and running but I make no argument that this process represents best practices.
Basic setup
The RSE template doesn’t mention anything about the arguably obvious steps of installing Node, Electron, and Electron Forge.
- Install Node with one of the pre-built installers available from the Node website.
After installing Node, Electron and Electron Forge are installed using npm from the command line. On Windows, Node installs a Node.js command prompt that I used for any npm and electron-forge commands (rather than the default Windows command prompt). The Node installer provides Windows users with the option to automatically install the necessary tools, including Chocolatey. I checked the box to automatically install these tools, but I’m not sure if this step is necessary to build the Electron app.
Run
npm install -g electron-forgein the Terminal (macOS)1 or Node.js command prompt (Windows) to install Electron Forge globally.Clone or download the GitHub repository for the RSE template.
Edit: The RSE template hasn’t been updated in over a year and the Node ecosystem evolves rapidly. I forked the repository, searched for each dependency package in package.json via the npm website, and updated version numbers to the latest version found in the npm package search. I also removed electron-forge from the devDependencies because it is installed globally. If you are having trouble with the original repository, you should try the forked version of the RSE template repository.
Build process on macOS
The RSE template repository includes a simple Shiny app. As a first step, I recommend following the steps below to confirm that you can build the executable with the simple app before trying your own app. At the end of this post, I will write more about extra steps required to build the executable for the DSM2 Viz Tool.
Open the Terminal and change the directory to the location of
r-shiny-electronorr-shiny-electron-master(see how to use the Terminal).Run
npm install --save-dev electronin the Terminal to install Electron locally.Run
npm installto set up the project in ther-shiny-electrondirectory.
You will get lots of warnings about outdated packages. I tried to fix the warnings with npm audit fix, but ran into problems and started over with a fresh clone of the RSE template.
Download R binary for macOS by running
./get-r-mac.sh.Identify and download packages used in Shiny app by running
Rscript add-cran-binary-pkgs.R.Run
npm startto test if app launches (and works correctly).If the app works correctly, run
electron-forge maketo build the macOS executable.
The build process will create a folder called Out in the r-shiny-electron directory. In Out/r-shiny-electron-darwin-x64, you will have an executable (r-shiny-electron.app) that you can run to test that the app is working correctly. In Out/make, you will have a zip file that contains the executable but is better for distributing because of the smaller file size.
It is possible to build a Windows installer on macOS, but it “takes forever.” I tried going down this road, but bailed after the process had run for 2 hours without finishing because I had access to a Windows machine for building the app.
Build process on Windows
As mentioned in the macOS section, I recommend following the steps below to confirm that you can build the executable with the simple Shiny app available through the RSE template before trying your own app.
Install Cygwin and the wget package, which is not installed by default. The
wgetfunction is used in./get-r-win.sh. If you havewgetfrom another installation process, then you might be able to skip this step.Install
innoextractwith Chocolatey by runningchoco install innoextractfrom the command prompt with administrative privileges, i.e., right click on the command prompt and chooseRun as administrator.innoextract 1.8is required. If you have a previous version of innoextract installed, then runchoco upgrade innoextract.2Open the Node.js command prompt and change the directory to the location of
r-shiny-electronorr-shiny-electron-master.Run
npm install --save-dev electronin the Node.js command prompt to install Electron locally.Run
npm installin the Node.js command prompt to set up the project in ther-shiny-electrondirectory.Change the directory to
r-shiny-electronin Cygwin, e.g., typecdin the Cygwin terminal and drag ther-shiny-electronfolder to Cygwin to paste the path. Use Notepad++ to open./get-r-win.shand confirm that the EOL characters are in Unix format. Download R binary for Windows by running./get-r-win.shin Cygwin.Identify and download packages used in the Shiny app by running
Rscript add-cran-binary-pkgs.Rfrom the RStudio Terminal. Remember to first change the directory tor-shiny-electron. You may also need to install theautomagicpackage first.Run
npm startin the Node.js command prompt to test if the app launches (and works correctly).3If the app works correctly, run
electron-forge makein the Node.js command prompt to build the Windows executable.
The build process will create a folder called Out in the r-shiny-electron directory. In Out/make/squirrel.windows/x64, you will have an installer executable called r-shiny-electron-1.0.0 Setup.exe.
Customizing build process for DSM2 Viz Tool
After working through the build process on the r-shiny-electron example app, I downloaded a fresh version of the RSE template, renamed the r-shiny-electron directory to DSM2-Viz-Tool, removed the app.R file from DSM2-Viz-Tool/shiny, and replaced it with the files for the DSM2 Viz Tool Shiny app. I also opened package.json in a text editor and changed a few fields (e.g., name, productName, version, description, author).
Next, I started working through the build process described above. However, before running npm start I needed to add the binary files for the rhdf5 and Rhdf5lib packages because Rscript add-cran-binary-pkgs.R doesn’t find Bioconductor packages. You can find where R packages are installed on your machine by running .libPaths() from the R console. I manually copied and pasted the rhdf5 and Rhdf5lib folders from the location indicated by the output of .libPaths() to DSM2-Viz-Tool/r-mac/library and DSM2-Viz-Tool/r-win/library on macOS and Windows, respectively. Then, I was able to finish the build process.
Working through this process involved plenty of frustration (because of my knowledge gaps), but it was extremely satisfying to arrive at the end goal of packaging the DSM2 Viz Tool as a standalone desktop application.
Footnotes
On macOS, you may need to provide permission to access
/usr/local/lib/node_modules. Solve the permission error by runningsudo chown -R $USER /usr/local/lib/node_modulesfrom the Terminal.↩︎If that doesn’t work, run
choco uninstall innoextractand then runchoco install innoextract.↩︎One of the requirements is that
gitis installed. An installer is available here.↩︎