cppRcppInLine.R

Plain text source: cppRcppInLine.R


# -*- Mode:R; Coding:us-ascii-unix; fill-column:160 -*-

################################################################################################################################################################
##
# @file      cppRcppInline.R
# @author    Mitch Richling <https://www.mitchr.me>
# @Copyright Copyright 2015 by Mitch Richling.  All rights reserved.
# @brief     Define and use a C++ function right inside of R.@EOL
# @Keywords  c++ function inside r package r cran examples inline
#
# cppFunction in Rcpp provides a very nice way to define and use C++ functions right inside R code.  The inline package lets you do this too, but I think the
# cppFunction has some better syntax assistance in the C++ code.  OTOH, inline also works with C and Fortran.
#

################################################################################################################################################################
# Load library

library(Rcpp)

################################################################################################################################################################
# Define, compile, and create an R wrapper for a C++ function that takes two vectors (potentially of different lengths), and concatenates them

Rcpp::cppFunction('NumericVector cppCat(NumericVector a, NumericVector b) {
  Rcpp::NumericVector c(a.size() + b.size());
  int j=0;
  for (int i=0; i<a.size(); i++)
    c[j++] += a[i];
  for (int i=0; i<b.size(); i++)
    c[j++] += b[i];
  return c;
}')

################################################################################################################################################################
# Call the function just defined

cppCat(1:10, 2:11)
 [1]  1  2  3  4  5  6  7  8  9 10  2  3  4  5  6  7  8  9 10 11
################################################################################################################################################################
# Define, compile, and create an R wrapper for a C++ function that takes a vector, and returns the sum

Rcpp::cppFunction('double cppSum(NumericVector x) {
  double total = 0;
  for(int i=0; i<x.size(); ++i) {
    total += x[i];
  }
  return total;
}')

################################################################################################################################################################
# Call the function just defined

cppSum(1:10)
[1] 55

The R session information (including the OS info, R version and all packages used):

    options(width=80)
    sessionInfo()
R version 3.3.0 (2016-05-03)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 8 (jessie)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] graphics  grDevices datasets  utils     grid      stats     base     

other attached packages:
[1] Rcpp_0.12.5        RColorBrewer_1.1-2 reshape2_1.4.1     ggplot2_2.1.0     
[5] dplyr_0.4.3        data.table_1.9.6   gridExtra_2.2.1    knitr_1.13        
[9] lattice_0.20-33   

loaded via a namespace (and not attached):
 [1] assertthat_0.1   plyr_1.8.3       chron_2.3-47     R6_2.1.2        
 [5] gtable_0.2.0     DBI_0.4-1        formatR_1.4      magrittr_1.5    
 [9] evaluate_0.9     scales_0.4.0     highr_0.6        stringi_1.0-1   
[13] tools_3.3.0      stringr_1.0.0    munsell_0.4.3    parallel_3.3.0  
[17] colorspace_1.2-6 methods_3.3.0   
    Sys.time()
[1] "2016-07-09 20:07:27 CDT"