Turn R (Shiny) Scripts Into Double-clickable OS X Applications With One Line of Code

By Bob Rudis (@hrbrmstr)
Sun 30 November 2014 | tags: blog, r, rstats, os x, yosemite, -- (permalink)

I was playing with some non-security-oriented R+Shiny code the other day, and thought that Shiny apps would be even more useful if they were double-clickable applications that you could “just run”—provided R was installed on the target system—vs have to cut/paste code into R. Now, I know it’s not hard to enter:

shiny::runGist('95ec24c1b0cb433a76a5', launch.browser=TRUE)

at an R console, but I’ll wager many developers have users that would still appreciate a double-clickable icon. Since I’m running OS X Yosemite on some of my development machines, I thought this would be a good reason to try out Apple’s new Javascript for Applications (JXA) since I am loath to work in regular AppleScript.

If you fire up Apple’s Script Editor, you can choose which language your script is in from the popup on the script window:

With JXA, all you need is one line of code to run a Shiny gist in R:

Application("R").cmd("shiny::runGist('95ec24c1b0cb433a76a5', launch.browser=TRUE)")

If you like/prefer “pure” AppleScript or are on an older version of OS X you still only need four lines of code:

tell application "R"
    cmd "shiny::runGist('95ec24c1b0cb433a76a5', launch.browser=TRUE)"
end tell

Save the script as an application and your users will be greeted with your Shiny app in their default browser.

Caveat Scripter

When an application is created this way, it quits immediately after launching R.app and then the R.app window is left open (showing all the R console output from the script). I personally think this is A Very Good Thing, but some folks may not, so you can miniaturize it upon startup via:

R = Application("R")
R.windows[0].miniaturized = true
R.cmd("shiny::runGist('95ec24c1b0cb433a76a5', launch.browser=TRUE)")


tell application "R"
    set miniaturized of window 1 to true
    cmd "shiny::runGist('95ec24c1b0cb433a76a5', launch.browser=TRUE)"
end tell

Users will still need to quit out of R, but you could also add a Shiny actionButton to your app that does a quit(save="no", runLast=FALSE) on submit (example code in this gist) to make it feel like a “real” application.

This all assumes & relies on the fact that the shiny package is already installed on your systems. To ensure any application-dependent packages are installed without forcing the users to manually install them, you can use something like this:

pkg <- c("shiny", "zipcode", "pbapply", "data.table", "dplyr", 
         "ggplot2", "grid", "gridExtra", "stringi", "magrittr")
new.pkg <- pkg[!(pkg %in% installed.packages())]
if (length(new.pkg)) {

at the top of server.R to ensure they are available to your application (note that said hack assumes a CRAN mirror is set).

Finally, for maximum compatibility, you’ll need to use the pure AppleScript version instead of the JXA version unless all your users are on Yosemite or higher.

Example Shiny Snowfall App

If you’re on OS X and have R and the shiny package installed, you can try out the sample “Shiny Snowfall”” app by downloading and unzipping this file (you may need to right/option-click->Save As):

Shiny Snowfall.zip

and then running the “Shiny Snowfall” app. (NOTE: You need to have your Security & Privacy settings set to “Allow apps downloaded from ‘Mac App Store and identified developers” to run the application or option/right-click “open” on the app icon”)

The icon used is from Adam Whitcroft’s (@adamwhitcroft) Climacons collection.

comments powered by Disqus