cppInline.R

Plain text source: cppInline.R


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

################################################################################################################################################################
##
# @file      cppInline.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 r package r cran examples inline
#
# The inline pakckage allows one ot define C++, C, and Fortran functions inline right inside of R code.  See also cppRcppInline.R.
#

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

library(inline)
Loading required package: methods
################################################################################################################################################################
# Define a C++ function that takes two vectors (potentially of different lengths), and concatenates them

src <- '
Rcpp::NumericVector xa(a);
Rcpp::NumericVector xb(b);
int len_xa = xa.size(), len_xb = xb.size();
Rcpp::NumericVector xc(len_xa + len_xb);
int j=0;
for (int i=0; i<len_xa; i++)
  xc[j++] += xa[i];
for (int i=0; i<len_xb; i++)
  xc[j++] += xb[i];
return xc;
'
################################################################################################################################################################
# Compile and create an R wrapper for the function defined above

cppCat <- inline::cxxfunction(signature(a="numeric", b="numeric"), src, plugin="Rcpp")

################################################################################################################################################################
# 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 a C++ function that takes a vector, and returns the sum

src <- '
Rcpp::NumericVector xx(x);
double total;
for (int i=0; i<xx.size(); i++)
    total += xx[i];
return Rcpp::wrap(total);
'
################################################################################################################################################################
# Compile and create an R wrapper for the function defined above

cppSum <- inline::cxxfunction(signature(x="numeric"), src, plugin="Rcpp")

################################################################################################################################################################
# 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] methods   graphics  grDevices datasets  utils     grid      stats    
[8] base     

other attached packages:
[1] inline_0.3.14      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] Rcpp_0.12.5      assertthat_0.1   plyr_1.8.3       chron_2.3-47    
 [5] R6_2.1.2         gtable_0.2.0     DBI_0.4-1        formatR_1.4     
 [9] magrittr_1.5     evaluate_0.9     scales_0.4.0     highr_0.6       
[13] stringi_1.0-1    tools_3.3.0      stringr_1.0.0    munsell_0.4.3   
[17] parallel_3.3.0   colorspace_1.2-6
    Sys.time()
[1] "2016-07-09 20:07:40 CDT"