Skip to main content

R and C++ integration: my first baby steps using inline

Hi,
Really excited to try out stuff in Dirk's book. The first chapter of the book gives a gentle introduction to Rcpp and inline package. The problem setting is how to integrate a fibonacci recursive function in C++, compile it and execute it in R. Benchmarking results are also shown.
The program code is all below in one R file. Its the same code in the book under listing 1.2

library(inline)
library(rbenchmark)
library(Rcpp)
#inline function for fibonacci algorithm in C++
incltxt <- '
int fibonacci(const int x) {
  if (x == 0) return(0);
if (x == 1) return(1);
  return fibonacci(x - 1) + fibonacci(x - 2);
}'
#wrapper function
fibRcpp <- cxxfunction(signature(xs="int"),
                       plugin="Rcpp",
                       incl=incltxt,
                        body='
                        int x = Rcpp::as<int>(xs);
                        return Rcpp::wrap( fibonacci(x) );
                       ')
#R function implementation the fibonacci algorithm
fibR <- function(n)
{
  if(n == 0) return(0)
  if(n == 1) return(1)
  return (fibR(n - 1) + fibR(n - 2))
}
#benchmark the R function call
a <- proc.time()
fibR(30)
proc.time() - a
#benchmark the R function call
benchR <- benchmark(replications = 1, fibR(30), columns = c('test','elapsed'))
#Benchmark the cpp function call
benchRCpp <- benchmark(replications = 1, fibRcpp(30), columns = c('test','elapsed'))
#How fast was it? About 200 times!!
(benchR$elapsed/benchRCpp$elapsed)

I was running this on an XP core2Duo machine and got a 200 times speed up. Yes I am poor and this is the best I can afford at the time but wow thats cool.

Anyway when I tried to compile the inline and the wrapper function I got some errors which looked like this.
Error in compileCode(f, code, language = language, verbose = verbose)
After going thru some of the posts on the topic I figured it had to do with the compiler I was using. My machine had a PATH variable with a Borland Cpp path which was causing the MAKE function in the R(C++) compiler to fall over.
I solved this by doing the following as R depends on the gcc compiler. Mind you this is for Windows.

  • Install the RTools in a directory. Usually this gets installed if you want to code in cpp in RStudio as it asks by default. Anyway you can install it independently.
  • Once installed, open command line by Run -> cmd
  • The Rtools directory may look something like this "C:\RBuildTools\3.1"
  • In the cmd prompt type PATH = %PATH%;C:\RBuildTools\3.1\bin;C:\RBuildTools\3.1\gcc-4.6.3\bin
  • Your good to go from there
  • Remember to remove the reference to other compilers and you will be able to compile the code above.
  • Sweet.

Comments

Popular posts from this blog

Basic Econometrics - Chapter 1 - Exercise 1

Exercise 1.1 Table 1.2 gives data on the Consumer Price Index (CPI) for seven industrialized countries with 1982-1984 = 100 as base of the index. a. From the given data, compute the inflation rate of each country. b. Plot the inflation rate for each country against time (i.e. use the horizantal axis for time and the vertical axis for the inflation rate) c. What broad conclusions can you draw abou the inflation experience in the seven countries? d. Which countries inflation seems to be most variable? Can you offer any explanation? ## Note here I have to skip several rows and add column names. Have a look at ## the raw data. Column names are c('Year', 'Canada', 'France', 'Germany', ## 'Italy','Japan', 'UK', 'US') cpi <- read.table("https://raw.githubusercontent.com/cablegui/Econometrics/master/OriginalData/Table%201.2.txt", skip = 6, col.names = c("Ye...

Step by step guide to installing and using miktex with RStudio (Windows)

Using miktex with Rstudio is very easy with the miktex portable app available from http://miktex.org/portable. Steps 1. Follow the instructions from http://miktex.org/portable to download and unzip the miktex portable application in a loccation of your choice. 2. In R write the following code in a script and save it. Note that the E:\\Software-Silo\\Miktex\\miktex\\bin location is the location where I unzipped the miktex portable application. # Install miktex y <- Sys.getenv("PATH") x <- paste0(y,";","E:\\Software-Silo\\Miktex\\miktex\\bin") Sys.setenv(PATH=x) 3. Run Miktex by double clicking the following application "miktex-portable.cmd" in the Miktex main directory. 4. Run step 2 in RStudio to install the path into R environment. 5. Open a new RNW in RStudio to test whether Miktex works . 6. Run Compile PDF in RStudio. It should be just at the top of the RNW file created in step 5. 7. You will now see a PDF file whic...

Installing and using ROracle in R

Hi, Hope this post keeps you in the best of health. I am an oracle user and wanted to know how to fetch database information in R. There is a package out there called ROracle but there are no binaries for it and it thus needs to be built and then installed. Here are the steps to install it on Windows 7 machines. 1. Download the package from http://cran.r-project.org/web/packages/ROracle/index.html. Since I wrote this post the latest that was available was  ROracle_1.1-12.tar.gz . 2. Place the package in the directory where R is installed. I placed mine in E:\R\R-3.0.2\bin folder. 3. Install RTools from http://cran.r-project.org/bin/windows/Rtools/. Since my R version is R-3.0.2 the toolkit I needed was RTools31.exe. 4. Install the Rtools software in the R home directory. I placed mine in E:\R\Rtools. Place all the extras in there too. For example I placed my 32 bit extras in E:\R\RExtras32 and the 64 bit in E:\R\RExtras64 folder. These extras are not necessary for ...