Share on:

Using Rcpp in Xcode

March 13, 2019
C++ R

Introduction

In this tutorial, we’ll look at how you can configure Xcode to work with and debug Rcpp objects and methods.

Why?

I’m interested in building fast machine learning models with C++ and exposing those models to R, much like ranger and xgboost. Rcpp makes it easy to pass objects between R and C++. However, the only way to debug Rcpp code within RStudio that I’m aware of is to litter the code with print statements. On the other hand, Xcode is a fantastic IDE (for mac os) to build C++ applications. It comes equipped with a very handy debugging tool and I’d like to use it to step through and debug my Rcpp code.

Before we get started, let’s take a look at the end result in action.

Setup

Firstly, I’ll assume you have R, Rcpp, and Xcode installed and working.

  1. From R, install RInside with install.packages("RInside")
  2. Add necessary R header files to the Xcode Header Search Paths. For me, these paths are
    • /Library/Frameworks/R.framework/Headers/
    • /Library/Frameworks/R.framework/Versions/3.5/Resources/library/RInside/include/
    • /Library/Frameworks/R.framework/Versions/3.5/Resources/library/Rcpp/include/

  1. Add the R and RInside dynamic libraries to your Xcode project. For me, these are located in
    • /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libR.dylib
    • /Library/Frameworks/R.framework/Versions/3.5/Resources/library/RInside/lib/libRInside.dylib

  1. #include <Rcpp.h> and #include <RInside.h> somwhere in your C++ project
  2. Inside main, create and embedded R instance with RInside R(argc, argv);
  3. Give it a go!
#include <iostream>
#include <Rcpp.h>
#include <RInside.h>

int main(int argc, const char * argv[]) {
    
    // Create an embedded R instance
    RInside R(argc, argv);
    
    // Print Hello World to the console using Rcout
    Rcpp::Rcout << "Hello World!" << std::endl;
    
    // Make a numeric vector. Then calculate and print the mean
    Rcpp::NumericVector x = Rcpp::NumericVector::create(1, 2, 3);
    double y = Rcpp::mean(x);
    std::cout << "Mean: " << y << std::endl;
    
    return 0;
}

Special Thanks

I owe special thanks to Brian Hall for his article Linking Xcode, C++ and R to create plots. This article is basically a re-write of his. And of course thanks to Dirk Eddelbuettel for making Rcpp and RInside.

comments powered by Disqus