New in V8: Calling R, from JavaScript, from R, from Javascript…

[This article was first published on OpenCPU, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

opencpu logo

The V8 package provides an R interface to Google’s open source JavaScript engine. The package is completely self contained and requires no runtime dependencies, making it very easy to execute JavaScript code from R. A hand full of CRAN packages use V8 to provide R bindings to useful JavaScript libraries. Have a look at the v8 vignette to get started.

Callback To R

New in version 0.10 is the ability to call back to R from within JavaScript using the console.r API. This is most easily demonstrated via V8’s interactive JavaScript console:

ctx <- v8()
ctx$console()

From JavaScript we can read/write R objects via console.r.get and console.r.assign, analogous to get and assign in R. The final argument is an optional list with arguments passed to toJSON or fromJSON which are used behind the scenes to convert objects between R and JavaScript.

// read the iris object into JS
var iris = console.r.get("iris")
var iris_col = console.r.get("iris", {dataframe : "col"})

//write an object back to the R session
console.r.assign("iris2", iris)
console.r.assign("iris3", iris, {simplifyVector : false})

Use console.r.call to call R functions. The first argument should be a string which evaluates to a function. The second argument contains a list of arguments passed to the function, similar to do.call in R. Both named and unnamed lists are supported. The return object is returned to JavaScript via JSON.

//calls rnorm(n=2, mean=10, sd=5)
var out = console.r.call('rnorm', {n: 2,mean:10, sd:5})
var out = console.r.call('rnorm', [2, 20, 5])

//anonymous function
var out = console.r.call('function(x){x^2}', {x:12})

There is also a console.r.eval function, which evaluates raw R code. It takes only a single argument (the string to evaluate) and does not return anything. Output is printed to the console.

console.r.eval('sessionInfo()')

Besides automatically converting objects, V8 also propagates exceptions between R, C++ and JavaScript up and down the stack. Hence you can catch R errors as JavaScript exceptions when calling an R function from JavaScript or vice versa. If nothing gets caught, exceptions bubble all the way up as R errors in your top-level R session.

//raise an error in R
console.r.call('stop("ouch!")')

//catch error from JavaScript
try {
   console.r.call('stop("ouch!")')
} catch (e) {
   console.log("Uhoh R had an error: " + e)
}

Thanks to Barret Schloerke for suggesting this feature and Dirk for pointing me in the right direction on how to call R functions from Rcpp (which is surprisingly easy).

To leave a comment for the author, please follow the link and comment on their blog: OpenCPU.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)