<?xml version="1.0" encoding="UTF-8"?>


<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
		<title>Rcpp Gallery</title>
		<description>Articles and code that provide examples of using the Rcpp package</description>
		<link>http://gallery.rcpp.org</link>
		<atom:link href="http://gallery.rcpp.org/feed.xml" rel="self" type="application/rss+xml" />
		
  		<item>
				<title>Using RcppProgress to control the long computations in C++</title>
				<description>&lt;p&gt;Usually you write c++ code with R when you want to speedup some calculations. Depending on the parameters, and especially during the development, it is difficult to anticipate the execution time of your computation, so that you do not know if you have to wait for 1 minute or hours.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://cran.at.r-project.org/web/packages/RcppProgress/index.html'&gt;RcppProgress&lt;/a&gt; is a tool to help you monitor the execution time of your C++ code, by providing a way to interrupt the execution inside the c++ code, and also to display a progress bar indicative of the state of your computation.&lt;/p&gt;

&lt;p&gt;Additionally, it is compatible with multithreaded code, for example using OpenMP, which is not as trivial as it may seem since you cannot just stop the execution in one thread, and not all threads should be writing in the console to avoid a garbled output.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::depends(RcppProgress)]]&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;progress.hpp&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='nf'&gt;long_computation&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  	&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
			&lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;Rf_dlnorm&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
		&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  system.time&lt;span class='p'&gt;(&lt;/span&gt;s  &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; long_computation&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
   user  system elapsed 
  0.096   0.000   0.095 
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 1002
&lt;/pre&gt;
&lt;h2 id='checking_interruption'&gt;checking interruption&lt;/h2&gt;

&lt;p&gt;Let&amp;#8217;s modify our code to add user interruption check, by calling &lt;code&gt;Progress::check_abort&lt;/code&gt;.&lt;br /&gt;Note the &lt;code&gt;Rcpp::depends(RcppProgress)&lt;/code&gt; attribute in the header part that takes care of the include path for the &lt;em&gt;progress.hpp&lt;/em&gt; header.&lt;/p&gt;

&lt;p&gt;Now the &lt;code&gt;long_computation2&lt;/code&gt; call should be interruptible (with CTRL+C in the classic R console).&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::depends(RcppProgress)]]&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;progress.hpp&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='nf'&gt;long_computation2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='n'&gt;Progress&lt;/span&gt; &lt;span class='n'&gt;p&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nb'&gt;false&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='c1'&gt;// in any case, we need to build an instance, should be improved in the next version&lt;/span&gt;
  &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Progress&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;check_abort&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  	&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
			&lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;Rf_dlnorm&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
		&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  system.time&lt;span class='p'&gt;(&lt;/span&gt;s  &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; long_computation2&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;3000&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='c1'&gt;# interrupt me&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
   user  system elapsed 
  0.840   0.000   0.838 
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 3002
&lt;/pre&gt;
&lt;p&gt;You may wonder Why do we put the &lt;code&gt;check_abort&lt;/code&gt; call in the first loop instead that in the second ? The &lt;code&gt;check_abort&lt;/code&gt; call is not neglectable, so it should be put in a place called often enough (once per second) but not too often.&lt;/p&gt;

&lt;h2 id='adding_a_progress_bar'&gt;adding a progress bar&lt;/h2&gt;

&lt;p&gt;Time to add the progress bar. The &lt;code&gt;increment&lt;/code&gt; function is quite fast, so we can put it in the second loop. In real life example, it is sufficient to put it at a place called at least every second.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::depends(RcppProgress)]]&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;progress.hpp&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='nf'&gt;long_computation3&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='n'&gt;display_progress&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nb'&gt;true&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='n'&gt;Progress&lt;/span&gt; &lt;span class='n'&gt;p&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;display_progress&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Progress&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;check_abort&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='n'&gt;p&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;increment&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='c1'&gt;// update progress&lt;/span&gt;
			&lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;Rf_dlnorm&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
		&lt;span class='p'&gt;}&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  system.time&lt;span class='p'&gt;(&lt;/span&gt;s  &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; long_computation3&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;3000&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='c1'&gt;# interrupt me&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
   user  system elapsed 
  0.848   0.000   0.848 
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 3002
&lt;/pre&gt;
&lt;h2 id='openmp_support'&gt;openMP support&lt;/h2&gt;

&lt;p&gt;First we need this to enable gcc openMP support:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;Sys.setenv&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;PKG_CXXFLAGS&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;-fopenmp&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
Sys.setenv&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;PKG_LIBS&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;-fopenmp&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here&amp;#8217;s an openMP version of our function:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#ifdef _OPENMP&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;omp.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#endif&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::depends(RcppProgress)]]&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;progress.hpp&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='nf'&gt;long_computation_omp&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;threads&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
 &lt;span class='err'&gt;#&lt;/span&gt;&lt;span class='n'&gt;ifdef&lt;/span&gt; &lt;span class='n'&gt;_OPENMP&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;threads&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
                &lt;span class='n'&gt;omp_set_num_threads&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;threads&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='n'&gt;REprintf&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Number of threads=%i&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;omp_get_max_threads&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
&lt;span class='cp'&gt;#endif&lt;/span&gt;
 
  &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='cp'&gt;#pragma omp parallel for schedule(dynamic)   &lt;/span&gt;
  &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;thread_sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  	&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
			&lt;span class='n'&gt;thread_sum&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;Rf_dlnorm&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
		&lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;thread_sum&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
	&lt;span class='p'&gt;}&lt;/span&gt;
  
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now check that it is parallelized:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  system.time&lt;span class='p'&gt;(&lt;/span&gt;s4 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; long_computation_omp&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;5000&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
   user  system elapsed 
  2.264   0.000   0.572 
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  s4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 5002
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  system.time&lt;span class='p'&gt;(&lt;/span&gt;s1 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; long_computation_omp&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;5000&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
   user  system elapsed 
  2.248   0.000   2.247 
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  s1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 5002
&lt;/pre&gt;
&lt;h2 id='adding_progress_monitoring_to_the_openmp_function'&gt;adding progress monitoring to the openMP function&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#ifdef _OPENMP&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;omp.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#endif&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::depends(RcppProgress)]]&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;progress.hpp&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='nf'&gt;long_computation_omp2&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;threads&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
&lt;span class='cp'&gt;#ifdef _OPENMP&lt;/span&gt;
  &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;threads&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='n'&gt;omp_set_num_threads&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;threads&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
 
&lt;span class='cp'&gt;#endif&lt;/span&gt;
  &lt;span class='n'&gt;Progress&lt;/span&gt; &lt;span class='n'&gt;p&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nb'&gt;true&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='cp'&gt;#pragma omp parallel for schedule(dynamic)   &lt;/span&gt;
  &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;thread_sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='o'&gt;!&lt;/span&gt; &lt;span class='n'&gt;Progress&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;check_abort&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='n'&gt;p&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;increment&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='c1'&gt;// update progress&lt;/span&gt;
      &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
          &lt;span class='n'&gt;thread_sum&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;Rf_dlnorm&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;thread_sum&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
  
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;nb&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  system.time&lt;span class='p'&gt;(&lt;/span&gt;s &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; long_computation_omp2&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;5000&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
   user  system elapsed 
  2.268   0.008   0.582 
&lt;/pre&gt;
&lt;h2 id='test_it_now'&gt;Test it now&lt;/h2&gt;

&lt;p&gt;If you want to test it now in your R console, just paste the following code (after installing RcppProgress of course):&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;library&lt;span class='p'&gt;(&lt;/span&gt;Rcpp&lt;span class='p'&gt;)&lt;/span&gt;
Sys.setenv&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;PKG_CXXFLAGS&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;-fopenmp&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
Sys.setenv&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;PKG_LIBS&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;-fopenmp&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

code&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;#39;&lt;/span&gt;
&lt;span class='s'&gt;#ifdef _OPENMP&lt;/span&gt;
&lt;span class='s'&gt;#include &amp;lt;omp.h&amp;gt;&lt;/span&gt;
&lt;span class='s'&gt;#endif&lt;/span&gt;
&lt;span class='s'&gt;// [[Rcpp::depends(RcppProgress)]]&lt;/span&gt;
&lt;span class='s'&gt;#include &amp;lt;progress.hpp&amp;gt;&lt;/span&gt;

&lt;span class='s'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='s'&gt;double long_computation_omp2(int nb, int threads=1) {&lt;/span&gt;
&lt;span class='s'&gt;#ifdef _OPENMP&lt;/span&gt;
&lt;span class='s'&gt;  if ( threads &amp;gt; 0 )&lt;/span&gt;
&lt;span class='s'&gt;    omp_set_num_threads( threads );&lt;/span&gt;
&lt;span class='s'&gt;    REprintf(&amp;quot;Number of threads=%i\\n&amp;quot;, omp_get_max_threads());&lt;/span&gt;
&lt;span class='s'&gt;#endif&lt;/span&gt;
&lt;span class='s'&gt;  Progress p(nb, true);&lt;/span&gt;
&lt;span class='s'&gt;  double sum = 0;&lt;/span&gt;
&lt;span class='s'&gt;#pragma omp parallel for schedule(dynamic)   &lt;/span&gt;
&lt;span class='s'&gt;  for (int i = 0; i &amp;lt; nb; ++i) {&lt;/span&gt;
&lt;span class='s'&gt;    double thread_sum = 0;&lt;/span&gt;
&lt;span class='s'&gt;    if ( ! Progress::check_abort() ) {&lt;/span&gt;
&lt;span class='s'&gt;      p.increment(); // update progress&lt;/span&gt;
&lt;span class='s'&gt;      for (int j = 0; j &amp;lt; nb; ++j) {&lt;/span&gt;
&lt;span class='s'&gt;          thread_sum += Rf_dlnorm(i+j, 0.0, 1.0, 0);&lt;/span&gt;
&lt;span class='s'&gt;        }&lt;/span&gt;
&lt;span class='s'&gt;    }&lt;/span&gt;
&lt;span class='s'&gt;    sum += thread_sum;&lt;/span&gt;
&lt;span class='s'&gt;  }&lt;/span&gt;
&lt;span class='s'&gt;  &lt;/span&gt;
&lt;span class='s'&gt;  return sum + nb;&lt;/span&gt;
&lt;span class='s'&gt;}&lt;/span&gt;
&lt;span class='s'&gt;&amp;#39;&lt;/span&gt;

sourceCpp&lt;span class='p'&gt;(&lt;/span&gt;code&lt;span class='o'&gt;=&lt;/span&gt;code&lt;span class='p'&gt;)&lt;/span&gt;
s &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; long_computation_omp2&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;10000&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Karl Forner&lt;br /&gt;&lt;em&gt;Quartz Bio&lt;/em&gt;&lt;/p&gt;</description>
				<pubDate>Thu, 16 May 2013 00:00:00 -0700</pubDate>
				<link>http://gallery.rcpp.org//articles/using-rcppprogress</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/using-rcppprogress</guid>
			</item>
		
  		<item>
				<title>An accept-reject sampler using RcppArmadillo&#58;&#58;sample()</title>
				<description>&lt;p&gt;The recently added &lt;code&gt;RcppArmadillo::sample()&lt;/code&gt; functionality provides the same algorithm used in R&amp;#8217;s &lt;code&gt;sample()&lt;/code&gt; to Rcpp-level code. Because R&amp;#8217;s own &lt;code&gt;sample()&lt;/code&gt; is written in C with minimal work done in R, writing a wrapper around &lt;code&gt;RcppArmadillo::sample()&lt;/code&gt; to then call in R won&amp;#8217;t get you much of a performance boost. However, if you need to repeatedly call &lt;code&gt;sample()&lt;/code&gt;, then calling a single function which performs everything in Rcpp-land (including multiple calls to &lt;code&gt;sample()&lt;/code&gt;) before returning to R can produce a noticeable speedup over a purely R-based solution.&lt;/p&gt;

&lt;h3 id='acceptreject_sampler_example'&gt;Accept-Reject Sampler Example&lt;/h3&gt;

&lt;p&gt;One place where this situation arises is in an accept-reject sampler where the candidate &amp;#8220;draw&amp;#8221; is the output of a call to &lt;code&gt;sample()&lt;/code&gt;. Concretely, let&amp;#8217;s suppose we want to sample 20 integers (without replacement) from 1 to 50 such that the sum of the 20 integers is less than 400. Far fewer than 10% of randomly drawn samples will meet this constraint.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;require&lt;span class='p'&gt;(&lt;/span&gt;RcppArmadillo&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Loading required package: RcppArmadillo
&lt;/pre&gt;&lt;pre class='output'&gt;
Loading required package: Rcpp
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;require&lt;span class='p'&gt;(&lt;/span&gt;rbenchmark&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Loading required package: rbenchmark
&lt;/pre&gt;
&lt;p&gt;The R code is straightforward enough. It has been written to mirror the logic of the C++ code, although that doesn&amp;#8217;t come at the cost of much performance.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;r_getInts &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='kr'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;samples&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    thresh &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;400&lt;/span&gt;
    results &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;20&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; samples&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
    cnt &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt;  &lt;span class='m'&gt;0&lt;/span&gt;

    &lt;span class='kr'&gt;while&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;cnt &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; samples&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        candidate &lt;span class='o'&gt;=&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;50&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;20&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

        &lt;span class='kr'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;sum&lt;span class='p'&gt;(&lt;/span&gt;candidate&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; thresh&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            results&lt;span class='p'&gt;[,&lt;/span&gt; cnt &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; candidate
            cnt &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; cnt &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='kr'&gt;return&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;results&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Although it is a bit longer, the logic of the C++ code is similar.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;RcppArmadilloExtensions/sample.h&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::depends(RcppArmadillo)]]&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;IntegerMatrix&lt;/span&gt; &lt;span class='nf'&gt;cpp_getInts&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;samples&lt;/span&gt;
                          &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  
    &lt;span class='n'&gt;RNGScope&lt;/span&gt; &lt;span class='n'&gt;scope&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  
    &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;cnt&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;IntegerMatrix&lt;/span&gt; &lt;span class='n'&gt;results&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;20&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;samples&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;IntegerVector&lt;/span&gt; &lt;span class='n'&gt;frame&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;seq_len&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;50&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;IntegerVector&lt;/span&gt; &lt;span class='n'&gt;candidate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;20&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;thresh&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;400&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
  
    &lt;span class='k'&gt;while&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;cnt&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;samples&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;candidate&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;RcppArmadillo&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;sample&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;frame&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
                                          &lt;span class='mi'&gt;20&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
                                          &lt;span class='n'&gt;FALSE&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;NumericVector&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
                                          &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;accumulate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;candidate&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;candidate&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
    
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;thresh&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='n'&gt;results&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;cnt&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;candidate&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;cnt&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
  
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;results&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id='performance'&gt;Performance&lt;/h3&gt;

&lt;p&gt;The Rcpp code tends to be about 7-9 times faster and this boost increases as the constraint becomes more complicated (and necessarily more costly in R).&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;benchmark&lt;span class='p'&gt;(&lt;/span&gt;r &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; r_getInts&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;50&lt;/span&gt;&lt;span class='p'&gt;)},&lt;/span&gt;
          cpp &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; cpp_getInts&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;50&lt;/span&gt;&lt;span class='p'&gt;)},&lt;/span&gt;
          replications &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          order &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;relative&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          columns &lt;span class='o'&gt;=&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;replications&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;elapsed&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
          &lt;span class='p'&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
  test replications relative elapsed
2  cpp           10     1.00   0.036
1    r           10    11.97   0.431
&lt;/pre&gt;
&lt;h3 id='in_the_real_world_'&gt;In the Real World &amp;#8230;&lt;/h3&gt;

&lt;p&gt;Where might the structure in this problem arise in practice? One set of instances are those where &amp;#8220;space&amp;#8221; matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sampling US cities such that no more than two are in any one state&lt;/li&gt;

&lt;li&gt;sampling cellphone towers such that no two are closer than &lt;em&gt;X&lt;/em&gt; miles apart&lt;/li&gt;

&lt;li&gt;sampling nodes in a graph/network such that no one has more than &lt;em&gt;K&lt;/em&gt; edges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these situations, R code to check the acceptance condition will likely be less efficient relative to the corresponding C++ code and so even larger speed-ups are realized.&lt;/p&gt;</description>
				<pubDate>Wed, 08 May 2013 00:00:00 -0700</pubDate>
				<link>http://gallery.rcpp.org//articles/an-example-of-using-Rcpp-sample</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/an-example-of-using-Rcpp-sample</guid>
			</item>
		
  		<item>
				<title>Using the RcppArmadillo-based Implementation of R's sample()</title>
				<description>&lt;h3 id='overview_and_motivation'&gt;Overview and Motivation&lt;/h3&gt;

&lt;p&gt;All of R&amp;#8217;s (r*, p*, q*, d*) distribution functions are available in C++ via the &lt;a href='http://cran.r-project.org/doc/manuals/R-exts.html#Random-numbers'&gt;R API&lt;/a&gt;. R is written in C, and the R API has no concept of a vector (at least not in the STL sense). Consequently, R&amp;#8217;s &lt;code&gt;sample()&lt;/code&gt; function can&amp;#8217;t just be exported via the R API, despite its importance and usefulness. The purpose of &lt;code&gt;RcppArmadilloExtensions/sample.h&lt;/code&gt; (written by Christian Gunning) is to provide this functionaility within C++ programs.&lt;/p&gt;

&lt;p&gt;Given sampling&amp;#8217;s central role in statistical programming, it is surprising that no standard library implementation for C or C++ is commonly available. There have been repeated questions about this on the Rcpp mailing list. StackExchange contains an extensive discussion of this question, but there is no &amp;#8220;canonical&amp;#8221; implementation.&lt;/p&gt;

&lt;p&gt;In general, it&amp;#8217;s best to use R&amp;#8217;s tried-and-true RNG-related functions leaving the praise (and blame) for their performance to others. R&amp;#8217;s C routines for sampling can be found in &lt;code&gt;src/main/random.c&lt;/code&gt;, with a discussion of the associated algorithms in &lt;a href='http://onlinelibrary.wiley.com/book/10.1002/9780470316726'&gt;Ripley 87&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id='goal'&gt;Goal&lt;/h4&gt;

&lt;p&gt;The goal is to exactly reproduce the behavior of R&amp;#8217;s sample() function in a templated C++/Rcpp function. So far, we&amp;#8217;ve reproduced everything but R&amp;#8217;s implementation of the Walker Alias method (used only when sampling with replacement using &amp;gt;200 non-zero weights). It uses convenience functions from Armadillo, and thus is added to RcppArmadillo as an extension. (The hope is that future extensions will follow!) All you need is this simple call, which should work for any Rcpp Vector: &lt;code&gt;RcppArmadillo::sample(x, size, replace,
prob)&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id='dependencies'&gt;Dependencies&lt;/h3&gt;

&lt;p&gt;Make sure you have a recent version of &lt;code&gt;RcppArmadillo&lt;/code&gt;. The earliest adequate release is 3.800.1 or preferably release 0.3.810.0. The usual &lt;code&gt;install.packages(&amp;quot;RcppArmadillo&amp;quot;)&lt;/code&gt; command will help if you need to update. You are ready to go from there:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;require&lt;span class='p'&gt;(&lt;/span&gt;RcppArmadillo&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Loading required package: RcppArmadillo
&lt;/pre&gt;&lt;pre class='output'&gt;
Loading required package: Rcpp
&lt;/pre&gt;
&lt;h3 id='quick_example'&gt;Quick Example&lt;/h3&gt;

&lt;p&gt;Here&amp;#8217;s a quick test to make sure it works.&lt;/p&gt;

&lt;p&gt;Some C++ code that can be hooked into with &lt;code&gt;sourceCpp()&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::depends(RcppArmadillo)]]&lt;/span&gt;

&lt;span class='cp'&gt;#include &amp;lt;RcppArmadilloExtensions/sample.h&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;CharacterVector&lt;/span&gt; &lt;span class='nf'&gt;csample_char&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;CharacterVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
                              &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;size&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                              &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='n'&gt;replace&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
                              &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;prob&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;NumericVector&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
                              &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='n'&gt;RNGScope&lt;/span&gt; &lt;span class='n'&gt;scope&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='n'&gt;CharacterVector&lt;/span&gt; &lt;span class='n'&gt;ret&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;RcppArmadillo&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;sample&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;size&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;replace&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;prob&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;ret&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice that we only need &lt;code&gt;#include &amp;lt;RcppArmadilloExtensions/sample.h&amp;gt;&lt;/code&gt; because &lt;code&gt;sample.h&lt;/code&gt; then &lt;code&gt;#include&lt;/code&gt;-s RcppArmadillo.&lt;/p&gt;

&lt;p&gt;We invoke the (automatically defined) &lt;code&gt;csample_char()&lt;/code&gt; R function:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;N &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;10&lt;/span&gt;
set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;7&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

sample.r &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt;letters&lt;span class='p'&gt;,&lt;/span&gt; N&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='k-Variable'&gt;T&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;7&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
sample.c &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; csample_char&lt;span class='p'&gt;(&lt;/span&gt;letters&lt;span class='p'&gt;,&lt;/span&gt; N&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='k-Variable'&gt;T&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

print&lt;span class='p'&gt;(&lt;/span&gt;identical&lt;span class='p'&gt;(&lt;/span&gt;sample.r&lt;span class='p'&gt;,&lt;/span&gt; sample.c&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;
&lt;p&gt;Of course, R&amp;#8217;s sample() function is &amp;#8220;internally&amp;#8221; vectorized and already fast. This functionality was &lt;em&gt;not&lt;/em&gt; added to speed up &lt;code&gt;sample()&lt;/code&gt;! Instead, this lets you stay in C++ when you need to sample from an Rcpp Vector, be it Numeric, Character, or whatever else.&lt;/p&gt;

&lt;h3 id='performance'&gt;Performance&lt;/h3&gt;

&lt;p&gt;That said, performance is still a concern. A quick test shows a dead-heat for sampling with replacement when compared to vanilla R:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;RcppArmadilloExtensions/sample.h&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::depends(RcppArmadillo)]]&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt; &lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;csample_num&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                           &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;size&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                           &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='n'&gt;replace&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                           &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;prob&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;NumericVector&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
                           &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='n'&gt;RNGScope&lt;/span&gt; &lt;span class='n'&gt;scope&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;ret&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;RcppArmadillo&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;sample&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;size&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;replace&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;prob&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;ret&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Consider the following timing where we compare vanilla R&amp;#8217;s &lt;code&gt;sample()&lt;/code&gt; to &lt;code&gt;RcppArmadillo::sample()&lt;/code&gt;. See the results for sampling with replacement with and without probability weights.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;require&lt;span class='p'&gt;(&lt;/span&gt;rbenchmark&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Loading required package: rbenchmark
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;7&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='c1'&gt;## Definition of Sampling Frame&lt;/span&gt;
n.elem &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;1e2&lt;/span&gt;
frame1 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; rnorm&lt;span class='p'&gt;(&lt;/span&gt;n.elem&lt;span class='p'&gt;)&lt;/span&gt;
probs1 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; runif&lt;span class='p'&gt;(&lt;/span&gt;n.elem&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='c1'&gt;## Definition of sampling regime&lt;/span&gt;
&lt;span class='c1'&gt;## Use replacement throughout&lt;/span&gt;
.replace &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='kc'&gt;TRUE&lt;/span&gt;
&lt;span class='c1'&gt;## Samplesize&lt;/span&gt;
n.samples1 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;1e4&lt;/span&gt;

&lt;span class='c1'&gt;## Without probabilities&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;r &lt;span class='o'&gt;=&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt;frame1&lt;span class='p'&gt;,&lt;/span&gt; n.samples1&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;.replace&lt;span class='p'&gt;),&lt;/span&gt;        
          cpp &lt;span class='o'&gt;=&lt;/span&gt; csample_num&lt;span class='p'&gt;(&lt;/span&gt;frame1&lt;span class='p'&gt;,&lt;/span&gt; n.samples1&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;.replace&lt;span class='p'&gt;),&lt;/span&gt;
          replications &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;1e3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          order &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;relative&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          columns &lt;span class='o'&gt;=&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;replications&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;elapsed&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
          &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
  test replications relative elapsed
2  cpp         1000    1.000   0.186
1    r         1000    1.188   0.221
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## With probabilities&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;r.prob &lt;span class='o'&gt;=&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt;frame1&lt;span class='p'&gt;,&lt;/span&gt; n.samples1&lt;span class='p'&gt;,&lt;/span&gt; prob &lt;span class='o'&gt;=&lt;/span&gt; probs1&lt;span class='p'&gt;,&lt;/span&gt; replace &lt;span class='o'&gt;=&lt;/span&gt; .replace&lt;span class='p'&gt;),&lt;/span&gt;
          cpp.prob &lt;span class='o'&gt;=&lt;/span&gt; csample_num&lt;span class='p'&gt;(&lt;/span&gt;frame1&lt;span class='p'&gt;,&lt;/span&gt; n.samples1&lt;span class='p'&gt;,&lt;/span&gt; prob &lt;span class='o'&gt;=&lt;/span&gt; probs1&lt;span class='p'&gt;,&lt;/span&gt; replace &lt;span class='o'&gt;=&lt;/span&gt; .replace&lt;span class='p'&gt;),&lt;/span&gt;
          replications &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;1e3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          order &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;relative&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          columns &lt;span class='o'&gt;=&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;replications&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;elapsed&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
          &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
      test replications relative elapsed
1   r.prob         1000    1.000   0.759
2 cpp.prob         1000    1.009   0.766
&lt;/pre&gt;
&lt;p&gt;The two perform equally well.&lt;/p&gt;

&lt;p&gt;Next we look at the performance of sampling without replacement. The number of draws can be no larger than the number of elements. Thus we&amp;#8217;re sampling fewer elements. Otherwise, the code is identical.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## Use the same sampling frame as before&lt;/span&gt;
&lt;span class='c1'&gt;## Definition of sampling regime&lt;/span&gt;
&lt;span class='c1'&gt;## No replacement&lt;/span&gt;
.replace &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='kc'&gt;FALSE&lt;/span&gt;
&lt;span class='c1'&gt;## Since sample size can&amp;#39;t exceed number elements, set them equal&lt;/span&gt;
n.samples2 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; n.elem

&lt;span class='c1'&gt;## Without probabilities&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;r &lt;span class='o'&gt;=&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt;frame1&lt;span class='p'&gt;,&lt;/span&gt; n.samples2&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;.replace&lt;span class='p'&gt;),&lt;/span&gt;        
          cpp &lt;span class='o'&gt;=&lt;/span&gt; csample_num&lt;span class='p'&gt;(&lt;/span&gt;frame1&lt;span class='p'&gt;,&lt;/span&gt; n.samples2&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;.replace&lt;span class='p'&gt;),&lt;/span&gt;
          replications &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;1e3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          order &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;relative&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          columns &lt;span class='o'&gt;=&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;replications&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;elapsed&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
          &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
  test replications relative elapsed
2  cpp         1000    1.000   0.011
1    r         1000    1.364   0.015
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## With probabilities&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;r.prob &lt;span class='o'&gt;=&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt;frame1&lt;span class='p'&gt;,&lt;/span&gt; n.samples2&lt;span class='p'&gt;,&lt;/span&gt; prob &lt;span class='o'&gt;=&lt;/span&gt; probs1&lt;span class='p'&gt;,&lt;/span&gt; replace &lt;span class='o'&gt;=&lt;/span&gt; .replace&lt;span class='p'&gt;),&lt;/span&gt;
          cpp.prob &lt;span class='o'&gt;=&lt;/span&gt; csample_num&lt;span class='p'&gt;(&lt;/span&gt;frame1&lt;span class='p'&gt;,&lt;/span&gt; n.samples2&lt;span class='p'&gt;,&lt;/span&gt; prob &lt;span class='o'&gt;=&lt;/span&gt; probs1&lt;span class='p'&gt;,&lt;/span&gt; replace &lt;span class='o'&gt;=&lt;/span&gt; .replace&lt;span class='p'&gt;),&lt;/span&gt;
          replications &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;1e3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          order &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;relative&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
          columns &lt;span class='o'&gt;=&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;replications&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;elapsed&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
          &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
      test replications relative elapsed
1   r.prob         1000        1   0.029
2 cpp.prob         1000        1   0.029
&lt;/pre&gt;
&lt;p&gt;Finally, what we haven&amp;#8217;t done. For sampling with replacement and more than 200 non-zero weights, R uses Walker&amp;#8217;s Alias method. This method can be substantially faster than the vanilla sampling method (with replacement, less than 200 non-zero weights). Rather than risk leading users astray with inefficient and inappropriate methods, we throw an error.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## Definition of Sampling Frame&lt;/span&gt;
n.elem &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;1e3&lt;/span&gt;
frame2 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; rnorm&lt;span class='p'&gt;(&lt;/span&gt;n.elem&lt;span class='p'&gt;)&lt;/span&gt;
probs2 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; runif&lt;span class='p'&gt;(&lt;/span&gt;n.elem&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='c1'&gt;## Definition of sampling regime&lt;/span&gt;
&lt;span class='c1'&gt;## Use replacement throughout&lt;/span&gt;
.replace &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='kc'&gt;TRUE&lt;/span&gt;
&lt;span class='c1'&gt;## Samplesize&lt;/span&gt;
n.samples1 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;1e4&lt;/span&gt;

&lt;span class='c1'&gt;## With probabilities&lt;/span&gt;
r.prob &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt;frame2&lt;span class='p'&gt;,&lt;/span&gt; n.samples1&lt;span class='p'&gt;,&lt;/span&gt; prob &lt;span class='o'&gt;=&lt;/span&gt; probs2&lt;span class='p'&gt;,&lt;/span&gt; replace &lt;span class='o'&gt;=&lt;/span&gt; .replace&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Warning: Walker's alias method used: results are different from R &amp;lt; 2.2.0
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;cpp.prob &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; csample_num&lt;span class='p'&gt;(&lt;/span&gt;frame2&lt;span class='p'&gt;,&lt;/span&gt; n.samples1&lt;span class='p'&gt;,&lt;/span&gt; prob &lt;span class='o'&gt;=&lt;/span&gt; probs2&lt;span class='p'&gt;,&lt;/span&gt; replace &lt;span class='o'&gt;=&lt;/span&gt; .replace&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Error: Walker Alias method not implemented. R-core sample() is likely
faster for this problem.
&lt;/pre&gt;</description>
				<pubDate>Fri, 12 Apr 2013 00:00:00 -0700</pubDate>
				<link>http://gallery.rcpp.org//articles/using-the-Rcpp-based-sample-implementation</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/using-the-Rcpp-based-sample-implementation</guid>
			</item>
		
  		<item>
				<title>Dynamic Wrapping and Recursion with Rcpp</title>
				<description>&lt;p&gt;We can leverage small parts of the R&amp;#8217;s C API in order to infer the type of objects directly at the run-time of a function call, and use this information to dynamically wrap objects as needed. We&amp;#8217;ll also present an example of recursing through a list.&lt;/p&gt;

&lt;p&gt;To get a basic familiarity with the main functions exported from R API, I recommend reading Hadley&amp;#8217;s guide to R&amp;#8217;s C internals guide &lt;a href='https://github.com/hadley/devtools/wiki/C-interface'&gt;here&lt;/a&gt; first, as we will be using some of these functions for navigating native R SEXPs. (Reading it will also give you an appreciation for just how much work Rcpp does in insulating us from the ugliness of the R API.)&lt;/p&gt;

&lt;p&gt;From the R API, we&amp;#8217;ll be using the &lt;code&gt;TYPEOF&lt;/code&gt; macro, as well as referencing the internal R types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;REALSXP&lt;/code&gt; for numeric vectors,&lt;/li&gt;

&lt;li&gt;&lt;code&gt;INTSXP&lt;/code&gt; for integer vectors,&lt;/li&gt;

&lt;li&gt;&lt;code&gt;VECSXP&lt;/code&gt; for lists&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We&amp;#8217;ll start with a simple example: an Rcpp function that takes a list, loops through it, and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;if we encounter a numeric vector, double each element in it;&lt;/li&gt;

&lt;li&gt;if we encounter an integer vector, add 1 to each element in it&lt;/li&gt;
&lt;/ul&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
 
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='nf'&gt;do_stuff&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='n'&gt;x_&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x_&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;List&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;iterator&lt;/span&gt; &lt;span class='n'&gt;it&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='n'&gt;it&lt;/span&gt; &lt;span class='o'&gt;!=&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;switch&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;TYPEOF&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='n'&gt;REALSXP&lt;/span&gt;: &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
          	&lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
		&lt;span class='k'&gt;break&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;    
            &lt;span class='p'&gt;}&lt;/span&gt;
      	    &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='n'&gt;INTSXP&lt;/span&gt;: &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='k'&gt;if&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;Rf_isFactor&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;break&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='c1'&gt;// factors have internal type INTSXP too&lt;/span&gt;
        	&lt;span class='n'&gt;IntegerVector&lt;/span&gt; &lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;IntegerVector&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
		&lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
                &lt;span class='k'&gt;break&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
      	    &lt;span class='p'&gt;}&lt;/span&gt;
      	    &lt;span class='nl'&gt;default:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='n'&gt;stop&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;incompatible SEXP encountered; only accepts lists with REALSXPs and INTSXPs&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
      	    &lt;span class='p'&gt;}&lt;/span&gt;
       &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;  
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A quick test:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;dat &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; list&lt;span class='p'&gt;(&lt;/span&gt; 
    &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='c1'&gt;## integer&lt;/span&gt;
    as.numeric&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;5&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='c1'&gt;## numeric&lt;/span&gt;
&lt;span class='p'&gt;)&lt;/span&gt;
tmp &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; do_stuff&lt;span class='p'&gt;(&lt;/span&gt;dat&lt;span class='p'&gt;)&lt;/span&gt;
print&lt;span class='p'&gt;(&lt;/span&gt;tmp&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[[1]]
[1] 2 3 4 5 6

[[2]]
[1]  2  4  6  8 10
&lt;/pre&gt;
&lt;p&gt;Some notes on the above:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We clone the list passed through to ensure we work with a copy, rather than the original list passed in,&lt;/li&gt;

&lt;li&gt;We switch over the internal R type using &lt;code&gt;TYPEOF&lt;/code&gt;, and do something for the case of numeric vectors (&lt;code&gt;REALSXP&lt;/code&gt;), and integer vectors (&lt;code&gt;INTSXP&lt;/code&gt;),&lt;/li&gt;

&lt;li&gt;After we&amp;#8217;ve figured out what kind of object we have, we can use &lt;code&gt;Rcpp::as&lt;/code&gt; to wrap the R object with the appropriate container,&lt;/li&gt;

&lt;li&gt;Because Rcpp&amp;#8217;s wrappers point to the internal R structures, any changes made to them are reflected in the R object wrapped,&lt;/li&gt;

&lt;li&gt;We use Rcpp sugar to easily add and multiply each element in a vector,&lt;/li&gt;

&lt;li&gt;We throw an error if a non-numeric / non-integer object is encountered. One could leave the &lt;code&gt;default:&lt;/code&gt; switch just to do nothing or fall through, or handle other &lt;code&gt;SEXP&lt;/code&gt;s as needed as well.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We also check that we fail gracefully when we encounter a non-accepted &lt;code&gt;SEXP&lt;/code&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;do_stuff&lt;span class='p'&gt;(&lt;/span&gt; list&lt;span class='p'&gt;(&lt;/span&gt;new.env&lt;span class='p'&gt;())&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Error: incompatible SEXP encountered; only accepts lists with REALSXPs and
INTSXPs
&lt;/pre&gt;
&lt;p&gt;However, this only operates on top-level objects within the list. What if your list contains other lists, and you want to recurse through those lists as well?&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s actually quite simple: if the internal R type of the object encountered is a &lt;code&gt;VECSXP&lt;/code&gt;, then we just call our recursive function on that element itself!&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
 
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='nf'&gt;recurse&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='n'&gt;x_&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x_&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;List&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;iterator&lt;/span&gt; &lt;span class='n'&gt;it&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='n'&gt;it&lt;/span&gt; &lt;span class='o'&gt;!=&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;switch&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;TYPEOF&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='n'&gt;VECSXP&lt;/span&gt;: &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;recurse&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        	&lt;span class='k'&gt;break&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='p'&gt;}&lt;/span&gt;
            &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='n'&gt;REALSXP&lt;/span&gt;: &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        	&lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            	&lt;span class='k'&gt;break&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
      	    &lt;span class='p'&gt;}&lt;/span&gt;
      	    &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='n'&gt;INTSXP&lt;/span&gt;: &lt;span class='p'&gt;{&lt;/span&gt;
            	&lt;span class='k'&gt;if&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;Rf_isFactor&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;break&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='c1'&gt;// factors have internal type INTSXP too&lt;/span&gt;
        	&lt;span class='n'&gt;IntegerVector&lt;/span&gt; &lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;IntegerVector&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;it&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        	&lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;tmp&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        	&lt;span class='k'&gt;break&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
      	    &lt;span class='p'&gt;}&lt;/span&gt;
      	    &lt;span class='nl'&gt;default:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='n'&gt;stop&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;incompatible SEXP encountered; only accepts lists containing lists, REALSXPs, and INTSXPs&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
      	    &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A test case:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;dat &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; list&lt;span class='p'&gt;(&lt;/span&gt; 
    x&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='c1'&gt;## integer&lt;/span&gt;
    y&lt;span class='o'&gt;=&lt;/span&gt;as.numeric&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;5&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='c1'&gt;## numeric&lt;/span&gt;
    z&lt;span class='o'&gt;=&lt;/span&gt;list&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='c1'&gt;## another list to recurse into&lt;/span&gt;
        zx&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;10L&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='c1'&gt;## integer&lt;/span&gt;
        zy&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;20&lt;/span&gt; &lt;span class='c1'&gt;## numeric&lt;/span&gt;
    &lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;)&lt;/span&gt;
out &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; recurse&lt;span class='p'&gt;(&lt;/span&gt;dat&lt;span class='p'&gt;)&lt;/span&gt;
print&lt;span class='p'&gt;(&lt;/span&gt;out&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
$x
[1] 2 3 4 5 6

$y
[1]  2  4  6  8 10

$z
$z$zx
[1] 11

$z$zy
[1] 40
&lt;/pre&gt;
&lt;p&gt;Note that all we had to do was add a &lt;code&gt;VECSXP&lt;/code&gt; case in our &lt;code&gt;switch&lt;/code&gt; statement. If we see a list, we call the same &lt;code&gt;recurse&lt;/code&gt; function on that list, and then re-assign the result of that recursive call. Neat!&lt;/p&gt;

&lt;p&gt;Hence, by using &lt;code&gt;TYPEOF&lt;/code&gt; to query the internal R type of objects pre-wrap, we can wrap objects as needed into an appropriate container, and then use Rcpp / C++ code as necessary to modify them.&lt;/p&gt;</description>
				<pubDate>Mon, 08 Apr 2013 00:00:00 -0700</pubDate>
				<link>http://gallery.rcpp.org//articles/rcpp-wrap-and-recurse</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/rcpp-wrap-and-recurse</guid>
			</item>
		
  		<item>
				<title>Using bigmemory with Rcpp</title>
				<description>&lt;p&gt;The &lt;a href='http://www.bigmemory.org'&gt;bigmemory package&lt;/a&gt; allows users to create matrices that are stored on disk, rather than in RAM. When an element is needed, it is read from the disk and cached in RAM. These objects can be much larger than native R matrices. Objects stored as such larger-than-RAM matrices are defined in the &lt;code&gt;big.matrix&lt;/code&gt; class and they are designed to behave similar to R matrices. However, they are actually implemented in C++ and can be easily accessed and manipulated directly from Rcpp as this example shows.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='c1'&gt;// The next line is all it takes to find the bigmemory&lt;/span&gt;
&lt;span class='c1'&gt;// headers -- thanks to the magic of Rcpp attributes&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::depends(bigmemory)]]&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;bigmemory/MatrixAccessor.hpp&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;numeric&amp;gt;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;BigColSums&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;XPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;BigMatrix&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;pBigMat&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='c1'&gt;// Create the matrix accessor so we can get at the elements of the matrix.&lt;/span&gt;
    &lt;span class='n'&gt;MatrixAccessor&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='kt'&gt;double&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;ma&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;pBigMat&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  
    &lt;span class='c1'&gt;// Create the vector we&amp;#39;ll store the column sums in.&lt;/span&gt;
    &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;colSums&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;pBigMat&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;ncol&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;size_t&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;pBigMat&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;ncol&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='n'&gt;colSums&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;accumulate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ma&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='n'&gt;ma&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;pBigMat&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='n'&gt;nrow&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;colSums&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A &lt;code&gt;BigMatrix&lt;/code&gt; object stores elements in a &lt;em&gt;column major&lt;/em&gt; format, meaning that values are accessed and filled in by column, rather than by row. The &lt;code&gt;MatrixAccessor&lt;/code&gt; implements the bracket operator, returning a pointer to the first element of a column. As a result, for a MatrixAccessor &lt;code&gt;ma&lt;/code&gt;, the i-th row and j-th column is accessed with &lt;code&gt;ma[j][i]&lt;/code&gt; rather than &lt;code&gt;m[i, j]&lt;/code&gt;, which R users are more familiar with.&lt;/p&gt;

&lt;p&gt;The code above defines a function &lt;code&gt;BigColSums&lt;/code&gt; that takes as an argument the address of the external pointer associated with a &lt;code&gt;big.matrix&lt;/code&gt; object. The function starts by creating a &lt;code&gt;MatrixAccessor&lt;/code&gt; to provide direct access to the matrix elements. The &lt;code&gt;MatrixAccessor&lt;/code&gt; constructor takes the type of elements as a template parameter and a &lt;code&gt;BigMatrix&lt;/code&gt; object as function parameter. Along with the MatrixAccessor, a NumericVector is created to hold the return value. Next, the function loops through the columns. For each iteration of the loop the values in a single column are accumulated and stored at the appropriate location in the &lt;code&gt;colSum&lt;/code&gt; vector. Finally, the columns sums are returned to R.&lt;/p&gt;

&lt;p&gt;The code below shows how to use the new Rcpp function. A &lt;code&gt;big.matrix&lt;/code&gt; object is created, named bigmat, with 10000 rows and 3 columns. Matrix elements are stored on disk in a &amp;#8220;backingfile&amp;#8221; named bigmat.bk. After creating the big.matrix object, the column values are filled in and then the &lt;code&gt;big.matrix&lt;/code&gt;&amp;#8217;s external pointer, which is references with the &lt;code&gt;address&lt;/code&gt; slot, is passed to the Rcpp &lt;code&gt;BigColSums&lt;/code&gt; function. The corresponding R function is shown below so that you can verify that our new function returns the correct value.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;suppressMessages&lt;span class='p'&gt;(&lt;/span&gt;require&lt;span class='p'&gt;(&lt;/span&gt;bigmemory&lt;span class='p'&gt;))&lt;/span&gt;

&lt;span class='c1'&gt;# set up big.matrix&lt;/span&gt;
nrows &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;10000&lt;/span&gt;
setwd&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;/tmp&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
bkFile &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;bigmat.bk&amp;quot;&lt;/span&gt;
descFile &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;bigmatk.desc&amp;quot;&lt;/span&gt;
bigmat &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; filebacked.big.matrix&lt;span class='p'&gt;(&lt;/span&gt;nrow&lt;span class='o'&gt;=&lt;/span&gt;nrows&lt;span class='p'&gt;,&lt;/span&gt; ncol&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; type&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;double&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;  
       	  			backingfile&lt;span class='o'&gt;=&lt;/span&gt;bkFile&lt;span class='p'&gt;,&lt;/span&gt; backingpath&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
				descriptorfile&lt;span class='o'&gt;=&lt;/span&gt;descFile&lt;span class='p'&gt;,&lt;/span&gt;
				dimnames&lt;span class='o'&gt;=&lt;/span&gt;c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kc'&gt;NULL&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='kc'&gt;NULL&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
  
&lt;span class='c1'&gt;# Each column value with be the column number multiplied by &lt;/span&gt;
&lt;span class='c1'&gt;# samples from a standard normal distribution.&lt;/span&gt;
set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;123&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='kr'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;i &lt;span class='kr'&gt;in&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; bigmat&lt;span class='p'&gt;[,&lt;/span&gt;i&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; rnorm&lt;span class='p'&gt;(&lt;/span&gt;nrows&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;i

&lt;span class='c1'&gt;# Call the Rcpp function.&lt;/span&gt;
res &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; BigColSums&lt;span class='p'&gt;(&lt;/span&gt;bigmat&lt;span class='o'&gt;@&lt;/span&gt;address&lt;span class='p'&gt;)&lt;/span&gt; 
print&lt;span class='p'&gt;(&lt;/span&gt;res&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1]  -23.72 -182.13 -212.98
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;  
&lt;span class='c1'&gt;# Verify that it is that same as running colSums on a matrix with equal values.&lt;/span&gt;
print&lt;span class='p'&gt;(&lt;/span&gt;all.equal&lt;span class='p'&gt;(&lt;/span&gt;res&lt;span class='p'&gt;,&lt;/span&gt; colSums&lt;span class='p'&gt;(&lt;/span&gt;bigmat&lt;span class='p'&gt;[,])))&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;</description>
				<pubDate>Thu, 14 Mar 2013 00:00:00 -0700</pubDate>
				<link>http://gallery.rcpp.org//articles/using-bigmemory-with-rcpp</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/using-bigmemory-with-rcpp</guid>
			</item>
		
  		<item>
				<title>Generating a multivariate gaussian distribution using RcppArmadillo</title>
				<description>&lt;p&gt;There are many ways to simulate a multivariate gaussian distribution assuming that you can simulate from independent univariate normal distributions. One of the most popular method is based on the &lt;a href='http://en.wikipedia.org/wiki/Cholesky_decomposition'&gt;Cholesky decomposition&lt;/a&gt;. Let&amp;#8217;s see how &lt;code&gt;Rcpp&lt;/code&gt; and &lt;code&gt;Armadillo&lt;/code&gt; perform on this task.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;RcppArmadillo.h&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::depends(RcppArmadillo)]]&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;arma&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;mat&lt;/span&gt; &lt;span class='n'&gt;mvrnormArma&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;arma&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='n'&gt;mu&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;arma&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;mat&lt;/span&gt; &lt;span class='n'&gt;sigma&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;ncols&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;sigma&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;n_cols&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
   &lt;span class='n'&gt;arma&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;mat&lt;/span&gt; &lt;span class='n'&gt;Y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;arma&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;randn&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ncols&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;arma&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;repmat&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;mu&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;Y&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='n'&gt;arma&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;chol&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sigma&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The easiest way to perform a Cholesky distribution in R is to use the &lt;code&gt;chol&lt;/code&gt; function in &lt;code&gt;R&lt;/code&gt; which interface some fast &lt;code&gt;LAPACK&lt;/code&gt; routines.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;### naive implementation in R&lt;/span&gt;
mvrnormR &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='kr'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;n&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    ncols &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; ncol&lt;span class='p'&gt;(&lt;/span&gt;sigma&lt;span class='p'&gt;)&lt;/span&gt;
    mu &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; rep&lt;span class='p'&gt;(&lt;/span&gt;mu&lt;span class='p'&gt;,&lt;/span&gt; each &lt;span class='o'&gt;=&lt;/span&gt; n&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='c1'&gt;## not obliged to use a matrix (recycling)&lt;/span&gt;
    mu &lt;span class='o'&gt;+&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;rnorm&lt;span class='p'&gt;(&lt;/span&gt;n &lt;span class='o'&gt;*&lt;/span&gt; ncols&lt;span class='p'&gt;),&lt;/span&gt; ncol &lt;span class='o'&gt;=&lt;/span&gt; ncols&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;%*%&lt;/span&gt; chol&lt;span class='p'&gt;(&lt;/span&gt;sigma&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We will also use &lt;code&gt;MASS:mvrnorm&lt;/code&gt; which implements it differently:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;require&lt;span class='p'&gt;(&lt;/span&gt;MASS&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Loading required package: MASS
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;### Covariance matrix and mean vector&lt;/span&gt;
sigma &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;0.9&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;-0.3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;0.9&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;-0.4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;-0.3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;-0.4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; ncol &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
mu &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;-3&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

require&lt;span class='p'&gt;(&lt;/span&gt;MASS&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='c1'&gt;### checking variance&lt;/span&gt;
set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;123&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
cor&lt;span class='p'&gt;(&lt;/span&gt;mvrnormR&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt;  sigma&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
        [,1]    [,2]    [,3]
[1,]  1.0000  0.8851 -0.3830
[2,]  0.8851  1.0000 -0.4675
[3,] -0.3830 -0.4675  1.0000
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;cor&lt;span class='p'&gt;(&lt;/span&gt;MASS&lt;span class='o'&gt;::&lt;/span&gt;mvrnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
        [,1]    [,2]    [,3]
[1,]  1.0000  0.9106 -0.3016
[2,]  0.9106  1.0000 -0.4599
[3,] -0.3016 -0.4599  1.0000
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;cor&lt;span class='p'&gt;(&lt;/span&gt;mvrnormArma&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
       [,1]    [,2]    [,3]
[1,]  1.000  0.9020 -0.3530
[2,]  0.902  1.0000 -0.4889
[3,] -0.353 -0.4889  1.0000
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## checking means&lt;/span&gt;
colMeans&lt;span class='p'&gt;(&lt;/span&gt;mvrnormR&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1]  9.850  4.911 -2.902
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;colMeans&lt;span class='p'&gt;(&lt;/span&gt;MASS&lt;span class='o'&gt;::&lt;/span&gt;mvrnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 10.051  5.046 -2.914
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;colMeans&lt;span class='p'&gt;(&lt;/span&gt;mvrnormArma&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1]  9.825  4.854 -2.873
&lt;/pre&gt;
&lt;p&gt;Now, let&amp;#8217;s benchmark the different versions:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;require&lt;span class='p'&gt;(&lt;/span&gt;rbenchmark&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Loading required package: rbenchmark
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;benchmark&lt;span class='p'&gt;(&lt;/span&gt;mvrnormR&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1e4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;),&lt;/span&gt;
          MASS&lt;span class='o'&gt;::&lt;/span&gt;mvrnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1e4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;),&lt;/span&gt;
          mvrnormArma&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1e4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; mu&lt;span class='p'&gt;,&lt;/span&gt; sigma&lt;span class='p'&gt;),&lt;/span&gt;
          columns &lt;span class='o'&gt;=&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;#39;test&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;replications&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;relative&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;elapsed&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
          order &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;#39;elapsed&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                             test replications relative elapsed
3   mvrnormArma(10000, mu, sigma)          100    1.000   0.219
1      mvrnormR(10000, mu, sigma)          100    1.913   0.419
2 MASS::mvrnorm(10000, mu, sigma)          100    2.046   0.448
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;RcppArmadillo&lt;/code&gt; function outperforms the MASS implementation and the naive R code, but more surprisinugly &lt;code&gt;mvrnormR&lt;/code&gt; is slightly faster than &lt;code&gt;mvrnorm&lt;/code&gt; in this benchmark.&lt;/p&gt;

&lt;p&gt;To be fair, while digging into the &lt;code&gt;MASS::mvrnorm&lt;/code&gt; code it appears that there are few code sanity checks ( such as the positive definiteness of &lt;code&gt;Sigma&lt;/code&gt; ).&lt;/p&gt;</description>
				<pubDate>Tue, 12 Mar 2013 00:00:00 -0700</pubDate>
				<link>http://gallery.rcpp.org//articles/simulate-multivariate-normal</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/simulate-multivariate-normal</guid>
			</item>
		
  		<item>
				<title>Using Rcpp with Boost.Regex for regular expression</title>
				<description>&lt;p&gt;Gabor &lt;a href='http://thread.gmane.org/gmane.comp.lang.r.rcpp/5019/focus=5023'&gt;asked&lt;/a&gt; about Rcpp use with regular expression libraries. This post shows a very simple example, based on&lt;br /&gt;&lt;a href='http://www.boost.org/doc/libs/1_53_0/libs/regex/example/snippets/credit_card_example.cpp'&gt;one of the Boost.RegEx examples&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We need to set linker options. This can be as simple as&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;Sys.setenv&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;PKG_LIBS&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;-lboost_regex&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With that, the following example can be built:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// cf www.boost.org/doc/libs/1_53_0/libs/regex/example/snippets/credit_card_example.cpp&lt;/span&gt;

&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='cp'&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;boost/regex.hpp&amp;gt;&lt;/span&gt;

&lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='nf'&gt;validate_card_format&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;regex&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;(&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;d{4}[- ]){3}&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;d{4}&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;regex_match&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;regex&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;A(&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;d{3,4})[- ]?(&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;d{4})[- ]?(&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;d{4})[- ]?(&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;d{4})&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;z&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt; &lt;span class='n'&gt;machine_format&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;1&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;2&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;3&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;4&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt; &lt;span class='n'&gt;human_format&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;1-&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;2-&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;3-&lt;/span&gt;&lt;span class='se'&gt;\\&lt;/span&gt;&lt;span class='s'&gt;4&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt; &lt;span class='n'&gt;machine_readable_card_number&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;regex_replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;machine_format&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;match_default&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;format_sed&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt; &lt;span class='n'&gt;human_readable_card_number&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;regex_replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;human_format&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;match_default&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;format_sed&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;DataFrame&lt;/span&gt; &lt;span class='n'&gt;regexDemo&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;vector&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;size&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    
    &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;vector&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='kt'&gt;bool&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;valid&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;vector&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;machine&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;vector&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;human&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;valid&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;  &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;validate_card_format&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
        &lt;span class='n'&gt;machine&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;machine_readable_card_number&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
        &lt;span class='n'&gt;human&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;human_readable_card_number&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;DataFrame&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Named&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;input&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;s&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                                   &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Named&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;valid&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;valid&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                                   &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Named&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;machine&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;machine&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                                   &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Named&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;human&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;human&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can test the function using the same input as the Boost example:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;s &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;0000111122223333&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;0000 1111 2222 3333&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;0000-1111-2222-3333&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;000-1111-2222-3333&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
regexDemo&lt;span class='p'&gt;(&lt;/span&gt;s&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                input valid          machine               human
1    0000111122223333 FALSE 0000111122223333 0000-1111-2222-3333
2 0000 1111 2222 3333  TRUE 0000111122223333 0000-1111-2222-3333
3 0000-1111-2222-3333  TRUE 0000111122223333 0000-1111-2222-3333
4  000-1111-2222-3333 FALSE  000111122223333  000-1111-2222-3333
&lt;/pre&gt;</description>
				<pubDate>Fri, 01 Mar 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/boost-regular-expressions</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/boost-regular-expressions</guid>
			</item>
		
  		<item>
				<title>Fast factor generation with Rcpp</title>
				<description>&lt;p&gt;Recall that factors are really just integer vectors with &amp;#8216;levels&amp;#8217;, i.e., character labels that get mapped to each integer in the vector. How can we take an arbitrary character, integer, numeric, or logical vector and coerce it to a factor with Rcpp? It&amp;#8217;s actually quite easy with Rcpp sugar:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='k'&gt;template&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;RTYPE&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;
&lt;span class='n'&gt;IntegerVector&lt;/span&gt; &lt;span class='n'&gt;fast_factor_template&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;Vector&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;RTYPE&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='n'&gt;Vector&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;RTYPE&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;levs&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;sort_unique&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='n'&gt;IntegerVector&lt;/span&gt; &lt;span class='n'&gt;out&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;match&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;levs&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='n'&gt;out&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;levels&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;CharacterVector&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;levs&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='n'&gt;out&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;class&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;factor&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;out&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;fast_factor&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='k'&gt;switch&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;TYPEOF&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='n'&gt;INTSXP&lt;/span&gt;: &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;fast_factor_template&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;INTSXP&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='n'&gt;REALSXP&lt;/span&gt;: &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;fast_factor_template&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;REALSXP&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='n'&gt;STRSXP&lt;/span&gt;: &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;fast_factor_template&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;STRSXP&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;R_NilValue&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note a few things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We template over the &lt;code&gt;RTYPE&lt;/code&gt;; i.e., the internal type that R assigns to its objects. For this example, we just need to know that the R types (as exposed in an R session) map to internal C types as &lt;code&gt;integer -&amp;gt; INTSXP&lt;/code&gt;, &lt;code&gt;numeric -&amp;gt; REALSXP&lt;/code&gt;, and &lt;code&gt;character -&amp;gt; STRSXP&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;We return an IntegerVector. Remember that factors are just integer vectors with a &lt;code&gt;levels&lt;/code&gt; attribute and class &lt;code&gt;factor&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;To generate our factor, we simply need to calculate the sorted unique values (the levels), and then match our vector back to those levels.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Next, we can just set the attributes on the object so that R will interpret it as a factor, rather than a plain old integer vector, when it&amp;#8217;s returned.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And a quick test:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;library&lt;span class='p'&gt;(&lt;/span&gt;microbenchmark&lt;span class='p'&gt;)&lt;/span&gt;
all.equal&lt;span class='p'&gt;(&lt;/span&gt; factor&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt; &lt;span class='p'&gt;),&lt;/span&gt; fast_factor&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;all.equal&lt;span class='p'&gt;(&lt;/span&gt; factor&lt;span class='p'&gt;(&lt;/span&gt; letters &lt;span class='p'&gt;),&lt;/span&gt; fast_factor&lt;span class='p'&gt;(&lt;/span&gt; letters &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;lets &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt; letters&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;1E5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='kc'&gt;TRUE&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
microbenchmark&lt;span class='p'&gt;(&lt;/span&gt; factor&lt;span class='p'&gt;(&lt;/span&gt;lets&lt;span class='p'&gt;),&lt;/span&gt; fast_factor&lt;span class='p'&gt;(&lt;/span&gt;lets&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Unit: milliseconds
               expr   min    lq median    uq   max
1      factor(lets) 5.315 5.766  5.930 6.069 32.93
2 fast_factor(lets) 1.420 1.458  1.474 1.486 28.85
&lt;/pre&gt;
&lt;p&gt;(However, note that this doesn&amp;#8217;t handle &lt;code&gt;NA&lt;/code&gt;s &amp;#8211; fixing that is left as an exercise. Similarily for logical vectors &amp;#8211; it&amp;#8217;s not quite as simple as just adding a call to a &lt;code&gt;LGLSXP&lt;/code&gt; templated call, but it&amp;#8217;s still not tough &amp;#8211; use &lt;code&gt;INTSXP&lt;/code&gt; and set set the levels to FALSE and TRUE.)&lt;/p&gt;

&lt;p&gt;We can demonstrate a simple example of where this might be useful with tapply. &lt;code&gt;tapply(x, group, FUN)&lt;/code&gt; is really just a wrapper to &lt;code&gt;lapply( split(x, group), FUN )&lt;/code&gt;, and &lt;code&gt;split&lt;/code&gt; relies on coercing &amp;#8216;group&amp;#8217; to a factor. Otherwise, &lt;code&gt;split&lt;/code&gt; calls &lt;code&gt;.Internal( split(x, group) )&lt;/code&gt;, and trying to do better than an internal C function is typically a bit futile. So, now that we&amp;#8217;ve written this, we can test a couple ways of performing a &lt;code&gt;tapply&lt;/code&gt;-like function:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;x &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; rnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1E5&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
gp &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; sample&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;1E5&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;TRUE&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
all&lt;span class='p'&gt;(&lt;/span&gt; tapply&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; gp&lt;span class='p'&gt;,&lt;/span&gt; mean&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; unlist&lt;span class='p'&gt;(&lt;/span&gt; lapply&lt;span class='p'&gt;(&lt;/span&gt; split&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; fast_factor&lt;span class='p'&gt;(&lt;/span&gt;gp&lt;span class='p'&gt;)),&lt;/span&gt; mean &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;all&lt;span class='p'&gt;(&lt;/span&gt; tapply&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; gp&lt;span class='p'&gt;,&lt;/span&gt; mean&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; unlist&lt;span class='p'&gt;(&lt;/span&gt; lapply&lt;span class='p'&gt;(&lt;/span&gt; split&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; gp&lt;span class='p'&gt;),&lt;/span&gt; mean &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;rbenchmark&lt;span class='o'&gt;::&lt;/span&gt;benchmark&lt;span class='p'&gt;(&lt;/span&gt; replications&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;20&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                tapply&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; gp&lt;span class='p'&gt;,&lt;/span&gt; mean&lt;span class='p'&gt;),&lt;/span&gt; 
                unlist&lt;span class='p'&gt;(&lt;/span&gt; lapply&lt;span class='p'&gt;(&lt;/span&gt; split&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; fast_factor&lt;span class='p'&gt;(&lt;/span&gt;gp&lt;span class='p'&gt;)),&lt;/span&gt; mean&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;),&lt;/span&gt;
                unlist&lt;span class='p'&gt;(&lt;/span&gt; lapply&lt;span class='p'&gt;(&lt;/span&gt; split&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; gp&lt;span class='p'&gt;),&lt;/span&gt; mean &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
                &lt;span class='p'&gt;)[,&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                                             test replications elapsed
2 unlist(lapply(split(x, fast_factor(gp)), mean))           20   0.200
3              unlist(lapply(split(x, gp), mean))           20   0.731
1                             tapply(x, gp, mean)           20   1.444
  relative
2    1.000
3    3.655
1    7.220
&lt;/pre&gt;
&lt;p&gt;To be fair, tapply actually returns a 1-dimensional array rather than a vector, and also can operate on more general arrays. However, we still do see a modest speedup both for using lapply, and for taking advantage of our fast factor generator.&lt;/p&gt;</description>
				<pubDate>Wed, 27 Feb 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/fast-factor-generation</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/fast-factor-generation</guid>
			</item>
		
  		<item>
				<title>Using Boost via the new BH package</title>
				<description>&lt;p&gt;Earlier today the new &lt;a href='http://cran.r-project.org/package=BH'&gt;BH&lt;/a&gt; package arrived on &lt;a href='http://cran.r-project.org'&gt;CRAN&lt;/a&gt;. Over the years, &lt;a href='http://www.stat.yale.edu/~jay/'&gt;Jay Emerson&lt;/a&gt;, &lt;a href='http://sites.google.com/site/kaneplusplus/'&gt;Michael Kane&lt;/a&gt; and I had numerous discussions about a basic &lt;a href='http://www.boost.org'&gt;Boost&lt;/a&gt; infrastructure package providing Boost headers for other CRAN packages. JJ and Romain chipped in as well, and Jay finally took the lead by first creating a &lt;a href='http://boostheaders.r-forge.r-project.org/'&gt;repo on R-Forge&lt;/a&gt;. And now the package is out, so what follows is a little demo.&lt;/p&gt;

&lt;p&gt;This example borrows something already implemented in my &lt;a href='(http://cran.r-project.org/package=RcppBDT'&gt;RcppBDT&lt;/a&gt; package which wraps code from &lt;a href='http://www.boost.org/doc/libs/1_52_0/doc/html/date_time.html'&gt;Boost Date_Time&lt;/a&gt; for R.&lt;br /&gt;Here, we compute the so-called &lt;a href='http://en.wikipedia.org/wiki/IMM_dates'&gt;IMM Date&lt;/a&gt; &amp;#8211; generally the the third Wednesday of the month (in the last month of the quarter). Boost has a function computing the &lt;em&gt;Nth day of the Mth week&lt;/em&gt; for a given month in a given year: we use that here with &lt;em&gt;Wednesday&lt;/em&gt; and the &lt;em&gt;third&lt;/em&gt; week.&lt;/p&gt;

&lt;p&gt;The kicker is that Boost uses templates almost exclusively. So by declaring an &lt;em&gt;depends attribute&lt;/em&gt; on BH, we ensure that the compilation will see the headers files provided by BH. Which happen to be the Boost headers, as that is what the package does. And that is all it takes.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// Use brandnew CRAN package BH for Boost headers&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::depends(BH)]]&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='c1'&gt;// One include file from Boost&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;boost/date_time/gregorian/gregorian_types.hpp&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Date&lt;/span&gt; &lt;span class='n'&gt;getIMMDate&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;mon&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;year&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='c1'&gt;// compute third Wednesday of given month / year&lt;/span&gt;
    &lt;span class='n'&gt;date&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;nth_day_of_the_week_in_month&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;nth_day_of_the_week_in_month&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;third&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                                          &lt;span class='n'&gt;Wednesday&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;mon&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='n'&gt;get_date&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;year&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;ymd_type&lt;/span&gt; &lt;span class='n'&gt;ymd&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;year_month_day&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;wrap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Date&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ymd&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;year&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ymd&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;month&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ymd&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;day&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can test this from R for 2013 by computing the first two:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;getIMMDate&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;2013&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] &quot;2013-03-20&quot;
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;getIMMDate&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;6&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;2013&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] &quot;2013-06-19&quot;
&lt;/pre&gt;
&lt;p&gt;And for kicks, the same for 2033:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;getIMMDate&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;2033&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] &quot;2033-03-16&quot;
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;getIMMDate&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;6&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;2033&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] &quot;2033-06-15&quot;
&lt;/pre&gt;
&lt;p&gt;The BH package is still pretty raw. For example, &lt;a href='../boost-foreach'&gt;yesterday&amp;#8217;s Rcpp Gallery post on Boost foreach&lt;/a&gt;] does not build as we have not yet included the relevant Boost library. So far, BH reflects the needs of Jay and Mike in their (awesome) &lt;a href='http://www.bigmemory.org'&gt;bigmemory&lt;/a&gt; project and my needs in RcppBDT, and then some. For the rest, let us know what may be missing.&lt;/p&gt;</description>
				<pubDate>Thu, 31 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/using-boost-with-bh</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/using-boost-with-bh</guid>
			</item>
		
  		<item>
				<title>Sorting Numeric Vectors in C++ and R</title>
				<description>&lt;p&gt;Consider the problem to sort all elements of the given vector in ascending order. We can simply use the function &lt;code&gt;std::sort&lt;/code&gt; from the C++ STL.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;stl_sort&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;sort&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;library&lt;span class='p'&gt;(&lt;/span&gt;rbenchmark&lt;span class='p'&gt;)&lt;/span&gt;
set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;123&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
z &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; rnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;100000&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
x &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; rnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='c1'&gt;# check that stl_sort is the same as sort&lt;/span&gt;
stopifnot&lt;span class='p'&gt;(&lt;/span&gt;all.equal&lt;span class='p'&gt;(&lt;/span&gt;stl_sort&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;),&lt;/span&gt; sort&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;)))&lt;/span&gt;

&lt;span class='c1'&gt;# benchmark stl_sort and sort&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;stl_sort&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;),&lt;/span&gt; sort&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;),&lt;/span&gt; order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)[,&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
         test replications elapsed relative
1 stl_sort(z)          100   0.632    1.000
2     sort(z)          100   1.164    1.842
&lt;/pre&gt;
&lt;p&gt;Consider the problem of sorting the first &lt;code&gt;n&lt;/code&gt; elements of a given vector. The function &lt;code&gt;std::partial_sort&lt;/code&gt; from the C++ STL does just this.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;stl_partial_sort&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;partial_sort&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;An alternate implementation of a partial sort algorithm is to use &lt;code&gt;std::nth_element&lt;/code&gt; to partition the given vector at the nth sorted element and then use &lt;code&gt;std::sort&lt;/code&gt;, both from the STL, to sort the vector from the beginning to the nth element.&lt;/p&gt;

&lt;p&gt;For an equivalent implementation in R, we can use the &lt;code&gt;sort&lt;/code&gt; function by specifying a vector of &lt;code&gt;1:n&lt;/code&gt; for the partial argument (i.e. &lt;code&gt;partial=1:n&lt;/code&gt;).&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;nth_partial_sort&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;nth&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;nth_element&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;nth&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
   &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;sort&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;nth&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;n &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;25000&lt;/span&gt;

&lt;span class='c1'&gt;# check that stl_partial_sort is equal to nth_partial_sort&lt;/span&gt;
stopifnot&lt;span class='p'&gt;(&lt;/span&gt;all.equal&lt;span class='p'&gt;(&lt;/span&gt;stl_partial_sort&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;50&lt;/span&gt;&lt;span class='p'&gt;)[&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;50&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; 
                    nth_partial_sort&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;50&lt;/span&gt;&lt;span class='p'&gt;)[&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;50&lt;/span&gt;&lt;span class='p'&gt;]))&lt;/span&gt;

&lt;span class='c1'&gt;# benchmark stl_partial_sort, nth_element_sort, and sort&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;stl_partial_sort&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;,&lt;/span&gt; n&lt;span class='p'&gt;),&lt;/span&gt;
          nth_partial_sort&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;,&lt;/span&gt; n&lt;span class='p'&gt;),&lt;/span&gt;
          sort&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;,&lt;/span&gt; partial&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;n&lt;span class='p'&gt;),&lt;/span&gt;
          order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)[,&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                    test replications elapsed relative
2 nth_partial_sort(z, n)          100   0.208    1.000
1 stl_partial_sort(z, n)          100   0.516    2.481
3 sort(z, partial = 1:n)          100   0.796    3.827
&lt;/pre&gt;
&lt;p&gt;An interesting result to note is the gain in speed of &lt;code&gt;nth_partial_sort&lt;/code&gt; over &lt;code&gt;stl_partial_sort&lt;/code&gt;. In this case, for the given data, it is faster to use the combination of&lt;code&gt;std::nth_element&lt;/code&gt; and &lt;code&gt;std::sort&lt;/code&gt; rather than &lt;code&gt;std::partial_sort&lt;/code&gt; to sort the first &lt;code&gt;n&lt;/code&gt; elements of a vector.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;stl_nth_element&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;nth_element&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, consider a problem where you only need a single element of a sorted vector. The function &lt;code&gt;std::nth_element&lt;/code&gt; from the C++ STL does just this. An example of this type of problem is computing the median of a given vector.&lt;/p&gt;

&lt;p&gt;For an equivalent implementation in R, we can use the &lt;code&gt;sort&lt;/code&gt; function by specifying a scalar value for the argument partial (i.e. &lt;code&gt;partial=n&lt;/code&gt;).&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;# check that the nth sorted elements of the vectors are equal&lt;/span&gt;
stopifnot&lt;span class='p'&gt;(&lt;/span&gt;all.equal&lt;span class='p'&gt;(&lt;/span&gt;stl_nth_element&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;43&lt;/span&gt;&lt;span class='p'&gt;)[&lt;/span&gt;&lt;span class='m'&gt;43&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; sort&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;,&lt;/span&gt; partial&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;43&lt;/span&gt;&lt;span class='p'&gt;)[&lt;/span&gt;&lt;span class='m'&gt;43&lt;/span&gt;&lt;span class='p'&gt;]))&lt;/span&gt;

&lt;span class='c1'&gt;# benchmark nth_element and sort&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;stl_nth_element&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;,&lt;/span&gt; n&lt;span class='p'&gt;),&lt;/span&gt;
         sort&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;,&lt;/span&gt; partial&lt;span class='o'&gt;=&lt;/span&gt;n&lt;span class='p'&gt;),&lt;/span&gt;
         order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)[,&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                   test replications elapsed relative
1 stl_nth_element(z, n)          100   0.089    1.000
2  sort(z, partial = n)          100   0.238    2.674
&lt;/pre&gt;
&lt;p&gt;While these are not huge speed improvements over the base R sort function, this post demonstrates how to easily access sorting functions in the C++ STL and is a good exercise to better understand the differences and performance of the sorting algorithms available in C++ and R.&lt;/p&gt;</description>
				<pubDate>Thu, 31 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/sorting</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/sorting</guid>
			</item>
		
  		<item>
				<title>Using Boost's foreach macro</title>
				<description>&lt;p&gt;Boost provides a macro, &lt;code&gt;BOOST_FOREACH&lt;/code&gt;, that allows us to easily iterate over elements in a container, similar to what we might do in R with &lt;code&gt;sapply&lt;/code&gt;. In particular, it frees us from having to deal with iterators as we do with &lt;code&gt;std::for_each&lt;/code&gt; and &lt;code&gt;std::transform&lt;/code&gt;. The macro is also compatible with the objects exposed by Rcpp.&lt;/p&gt;

&lt;p&gt;Side note: C++11 has introduced a similar for-each looping construct of the form&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for (T &amp;amp;elem : X) { /*do stuff*/ } &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, CRAN does not (at the time of this posting) allow C++11 in uploads and hence this Boost solution might be preferred if you want to use a for-each construct in a package.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;BOOST_FOREACH&lt;/code&gt; macro is exposed when we use &lt;code&gt;#include &amp;lt;boost/foreach.hpp&amp;gt;&lt;/code&gt;. Make sure the Boost libraries are in your includepath so that they can be found and included easily. Because it&amp;#8217;s a header-only library we don&amp;#8217;t have to worry about external dependencies or linking.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ll use a simple example where we square each element in a vector.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;boost/foreach.hpp&amp;gt;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
 
&lt;span class='c1'&gt;// the C-style upper-case macro name is a bit ugly; let&amp;#39;s change it&lt;/span&gt;
&lt;span class='c1'&gt;// note: this could cause compiler errors if it conflicts with other includes&lt;/span&gt;
&lt;span class='cp'&gt;#define foreach BOOST_FOREACH&lt;/span&gt;
 
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;square&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  
  &lt;span class='c1'&gt;// elem is a reference to each element in x&lt;/span&gt;
  &lt;span class='c1'&gt;// we can re-assign to these elements as well&lt;/span&gt;
  &lt;span class='n'&gt;foreach&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='kt'&gt;double&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;elem&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;elem&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;elem&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;elem&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
  
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;square&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
 [1]   1   4   9  16  25  36  49  64  81 100
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;square&lt;span class='p'&gt;(&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;16&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; nrow&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
     [,1] [,2] [,3] [,4]
[1,]    1   25   81  169
[2,]    4   36  100  196
[3,]    9   49  121  225
[4,]   16   64  144  256
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## we check that the function handles various &amp;#39;special&amp;#39; values&lt;/span&gt;
x &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;NA&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;NaN&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;Inf&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='kc'&gt;Inf&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
square&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1]   1   4  NA  16 NaN Inf Inf
&lt;/pre&gt;
&lt;p&gt;And a quick benchmark:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;x &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; rnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1E5&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
library&lt;span class='p'&gt;(&lt;/span&gt;microbenchmark&lt;span class='p'&gt;)&lt;/span&gt;
microbenchmark&lt;span class='p'&gt;(&lt;/span&gt;
  square&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;),&lt;/span&gt;
  x&lt;span class='o'&gt;^&lt;/span&gt;&lt;span class='m'&gt;2&lt;/span&gt;
  &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Unit: microseconds
       expr    min     lq median     uq  max
1 square(x)  71.04  71.64  71.89  74.14 1518
2       x^2 346.36 350.70 359.18 433.33 1842
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;all.equal&lt;span class='p'&gt;(&lt;/span&gt; square&lt;span class='p'&gt;(&lt;/span&gt;x&lt;span class='p'&gt;),&lt;/span&gt; x&lt;span class='o'&gt;^&lt;/span&gt;&lt;span class='m'&gt;2&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;
&lt;p&gt;If you are defining your own classes / containers and want them to be compatible with one of these for-each constructs, you will need to define some methods for iteration across these objects. See &lt;a href='http://stackoverflow.com/questions/7562356/c11-foreach-syntax-and-custom-iterator'&gt;this post&lt;/a&gt; on SO for more details.&lt;/p&gt;

&lt;p&gt;For more information on &lt;code&gt;BOOST_FOREACH&lt;/code&gt;, check the documentation &lt;a href='http://www.boost.org/doc/libs/1_52_0/doc/html/foreach.html'&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
				<pubDate>Wed, 30 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/boost-foreach</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/boost-foreach</guid>
			</item>
		
  		<item>
				<title>Quick conversion of a list of lists into a data frame</title>
				<description>&lt;p&gt;Data frames are one of R&amp;#8217;s distinguishing features. Exposing a list of lists as an array of cases, they make many formal operations such as regression or optimization easy to represent.&lt;/p&gt;

&lt;p&gt;The R data.frame operation for lists is quite slow, in large part because it exposes a vast amount of functionality. This sample shows one way to write a much faster data.frame creator in C++ if one is willing to forego that generality.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='nf'&gt;CheapDataFrameBuilder&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='n'&gt;a&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;List&lt;/span&gt; &lt;span class='n'&gt;returned_frame&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;a&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;GenericVector&lt;/span&gt; &lt;span class='n'&gt;sample_row&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;returned_frame&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;StringVector&lt;/span&gt; &lt;span class='n'&gt;row_names&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sample_row&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;length&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;sample_row&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;length&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='kt'&gt;char&lt;/span&gt; &lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='n'&gt;sprintf&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;]),&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;%d&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='n'&gt;row_names&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='n'&gt;returned_frame&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;row.names&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;row_names&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='n'&gt;StringVector&lt;/span&gt; &lt;span class='n'&gt;col_names&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;returned_frame&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;length&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;returned_frame&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;length&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt; &lt;span class='o'&gt;++&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='kt'&gt;char&lt;/span&gt; &lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
        &lt;span class='n'&gt;sprintf&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;]),&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;X.%d&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='n'&gt;col_names&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;j&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='n'&gt;returned_frame&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;names&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;col_names&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;returned_frame&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;class&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;data.frame&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;returned_frame&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is the result of comparing the native function to this version.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;library&lt;span class='p'&gt;(&lt;/span&gt;rbenchmark&lt;span class='p'&gt;)&lt;/span&gt;
a &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; replicate&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;250&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; simplify&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='kc'&gt;FALSE&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

res &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; benchmark&lt;span class='p'&gt;(&lt;/span&gt;as.data.frame&lt;span class='p'&gt;(&lt;/span&gt;a&lt;span class='p'&gt;),&lt;/span&gt; 
                 CheapDataFrameBuilder&lt;span class='p'&gt;(&lt;/span&gt;a&lt;span class='p'&gt;),&lt;/span&gt; 
                 order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; replications&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;500&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
res&lt;span class='p'&gt;[,&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                      test replications elapsed relative
2 CheapDataFrameBuilder(a)          500   0.104      1.0
1         as.data.frame(a)          500  16.730    160.9
&lt;/pre&gt;
&lt;p&gt;There are some subtleties in this code:&lt;/p&gt;

&lt;p&gt;&amp;#8212; It turns out that one can&amp;#8217;t send super-large data frames to it because of possible buffer overflows. I&amp;#8217;ve never seen that problem when I&amp;#8217;ve written Rcpp functions which exchanged SEXPs with R, but this one uses Rcpp:export in order to use sourceCpp.&lt;/p&gt;

&lt;p&gt;&amp;#8212; Notice the invocation of clone() in the first line of the code. If you don&amp;#8217;t do that, you wind up side-effecting the parameter, which is not what most people would expect.&lt;/p&gt;</description>
				<pubDate>Tue, 22 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/faster-data-frame-creation</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/faster-data-frame-creation</guid>
			</item>
		
  		<item>
				<title>Passing user-supplied C++ functions</title>
				<description>&lt;p&gt;Baptiste &lt;a href='http://stackoverflow.com/questions/14428687/rcpparmadillo-pass-user-defined-function'&gt;asked on StackOverflow about letting users supply C++ functions&lt;/a&gt; for use with Armadillo / RcppArmadillo. This posts helps with an extended answer. There is nothing specific about Armadillo here, this would the same way with Eigen, the GSL or any other library a user wants to support (and provides his or her own &lt;code&gt;as&amp;lt;&amp;gt;()&lt;/code&gt; and &lt;code&gt;wrap()&lt;/code&gt; converters which we already have for Armadillo, Eigen and the GSL).&lt;/p&gt;

&lt;p&gt;To set the stage, let us consider two simple functions of a vector&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::depends(RcppArmadillo)]]&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;RcppArmadillo.h&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;arma&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='nf'&gt;fun1_cpp&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;vec&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;	&lt;span class='c1'&gt;// a first function &lt;/span&gt;
    &lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='nf'&gt;fun2_cpp&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;vec&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;	&lt;span class='c1'&gt;// and a second function&lt;/span&gt;
    &lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These are pretty boring and standard functions, and we could simple switch between them via if/else statements. Where it gets interesting is via the &lt;code&gt;SEXP&lt;/code&gt; wrapping offered by &lt;code&gt;XPtr&lt;/code&gt; below.&lt;/p&gt;

&lt;p&gt;But before we get there, let us do this one step at a time.&lt;/p&gt;

&lt;p&gt;This typdef is important and just says that &lt;code&gt;funcPtr&lt;/code&gt; will take a const reference to a vec and return a vector &amp;#8211; just like our two functions above&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='k'&gt;typedef&lt;/span&gt; &lt;span class='nf'&gt;vec&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='p'&gt;)(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;vec&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The following function takes a string argument, picks a function and returns it wrapped as an external pointer &lt;code&gt;SEXP&lt;/code&gt;. We could return this to R as well.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;XPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;putFunPtrInXPtr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt; &lt;span class='n'&gt;fstr&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;fstr&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;fun1&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;XPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;fun1_cpp&lt;/span&gt;&lt;span class='p'&gt;)));&lt;/span&gt;
    &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='nf'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;fstr&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;fun2&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;XPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;fun2_cpp&lt;/span&gt;&lt;span class='p'&gt;)));&lt;/span&gt;
    &lt;span class='k'&gt;else&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;XPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;R_NilValue&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='c1'&gt;// runtime error as NULL no XPtr&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A simple test of this function follows. First a function using it:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='nf'&gt;callViaString&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;string&lt;/span&gt; &lt;span class='n'&gt;funname&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;XPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;xpfun&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;putFunPtrInXPtr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;funname&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;funcPtr&lt;/span&gt; &lt;span class='n'&gt;fun&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;xpfun&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;fun&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then a call, showing access to both functions:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;callViaString&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;fun1&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
     [,1]
[1,]    2
[2,]    4
[3,]    6
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;callViaString&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;fun2&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
     [,1]
[1,]   10
[2,]   20
[3,]   30
&lt;/pre&gt;
&lt;p&gt;But more interestingly, we can also receive a function pointer via the &lt;code&gt;SEXP&lt;/code&gt; wrapping:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;fun &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; putFunPtrInXPtr&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;fun1&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And use it in this function which no longer switches:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='nf'&gt;callViaXPtr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;xpsexp&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;XPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;funcPtr&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;xpfun&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;xpsexp&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;funcPtr&lt;/span&gt; &lt;span class='n'&gt;fun&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;xpfun&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;vec&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;fun&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As seen here:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;callViaXPtr&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; fun&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
     [,1]
[1,]    2
[2,]    4
[3,]    6
[4,]    8
&lt;/pre&gt;
&lt;p&gt;This is a reasonably powerful and generic framework offered by Rcpp and sitting on top of R&amp;#8217;s external pointers.&lt;/p&gt;</description>
				<pubDate>Mon, 21 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/passing-cpp-function-pointers</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/passing-cpp-function-pointers</guid>
			</item>
		
  		<item>
				<title>Coercion of matrix to sparse matrix (dgCMatrix) and maintaining dimnames.</title>
				<description>&lt;p&gt;Consider the following matrix&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;nr &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; nc &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;6&lt;/span&gt;
set.seed &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;123&lt;/span&gt;
m  &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;sample&lt;span class='p'&gt;(&lt;/span&gt;c&lt;span class='p'&gt;(&lt;/span&gt;rep&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='m'&gt;9&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;nr&lt;span class='o'&gt;*&lt;/span&gt;nc&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='k-Variable'&gt;T&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; nrow&lt;span class='o'&gt;=&lt;/span&gt;nr&lt;span class='p'&gt;,&lt;/span&gt; ncol&lt;span class='o'&gt;=&lt;/span&gt;nc&lt;span class='p'&gt;)&lt;/span&gt;
sum&lt;span class='p'&gt;(&lt;/span&gt;m&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;/&lt;/span&gt;length&lt;span class='p'&gt;(&lt;/span&gt;m&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 0.1667
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;dimnames&lt;span class='p'&gt;(&lt;/span&gt;m&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; list&lt;span class='p'&gt;(&lt;/span&gt;letters&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;nr&lt;span class='p'&gt;],&lt;/span&gt; letters&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;nc&lt;span class='p'&gt;])&lt;/span&gt;
m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
  a b c d e f
a 0 0 0 0 0 1
b 0 0 0 1 0 1
c 0 0 0 0 0 0
d 0 0 0 0 0 0
e 1 1 0 0 0 0
f 0 0 0 1 0 0
&lt;/pre&gt;
&lt;p&gt;This matrix can be coerced to a sparse matrix with&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;library&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Matrix&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Loading required package: methods
&lt;/pre&gt;&lt;pre class='output'&gt;
Loading required package: lattice
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;M1 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; as&lt;span class='p'&gt;(&lt;/span&gt;m&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;dgCMatrix&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
M1 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
6 x 6 sparse Matrix of class &quot;dgCMatrix&quot;
  a b c d e f
a . . . . . 1
b . . . 1 . 1
c . . . . . .
d . . . . . .
e 1 1 . . . .
f . . . 1 . .
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;str&lt;span class='p'&gt;(&lt;/span&gt;M1&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Formal class 'dgCMatrix' [package &quot;Matrix&quot;] with 6 slots
  ..@ i       : int [1:6] 4 4 1 5 0 1
  ..@ p       : int [1:7] 0 1 2 2 4 4 6
  ..@ Dim     : int [1:2] 6 6
  ..@ Dimnames:List of 2
  .. ..$ : chr [1:6] &quot;a&quot; &quot;b&quot; &quot;c&quot; &quot;d&quot; ...
  .. ..$ : chr [1:6] &quot;a&quot; &quot;b&quot; &quot;c&quot; &quot;d&quot; ...
  ..@ x       : num [1:6] 1 1 1 1 1 1
  ..@ factors : list()
&lt;/pre&gt;
&lt;p&gt;Using &lt;a href='http://eigen.tuxfamily.org'&gt;Eigen&lt;/a&gt; via &lt;a href='http://cran.r-project.org/web/packages/RcppEigen/index.html'&gt;RcppEigen&lt;/a&gt; we can obtain the coercion as:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::depends(RcppEigen)]]&lt;/span&gt;

&lt;span class='cp'&gt;#include &amp;lt;RcppEigen.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='nf'&gt;asdgCMatrix_&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;XX_&lt;/span&gt; &lt;span class='p'&gt;){&lt;/span&gt;
  &lt;span class='k'&gt;typedef&lt;/span&gt; &lt;span class='n'&gt;Eigen&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;SparseMatrix&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='kt'&gt;double&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;SpMat&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;   
  &lt;span class='k'&gt;typedef&lt;/span&gt; &lt;span class='n'&gt;Eigen&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Map&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;Eigen&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;MatrixXd&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;MapMatd&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='c1'&gt;// Input: must be double&lt;/span&gt;
  &lt;span class='n'&gt;MapMatd&lt;/span&gt; &lt;span class='n'&gt;X&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;MapMatd&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;XX_&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
  &lt;span class='n'&gt;SpMat&lt;/span&gt; &lt;span class='n'&gt;Xsparse&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;X&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;sparseView&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;              &lt;span class='c1'&gt;// Output: sparse matrix&lt;/span&gt;
  &lt;span class='n'&gt;S4&lt;/span&gt; &lt;span class='n'&gt;Xout&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;wrap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Xsparse&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;                      &lt;span class='c1'&gt;// Output: as S4 object&lt;/span&gt;
  &lt;span class='n'&gt;NumericMatrix&lt;/span&gt; &lt;span class='n'&gt;Xin&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;XX_&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;                      &lt;span class='c1'&gt;// Copy dimnames&lt;/span&gt;
  &lt;span class='n'&gt;Xout&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;slot&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Dimnames&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;List&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Xin&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;dimnames&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)));&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Xout&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='p'&gt;(&lt;/span&gt;M2 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; asdgCMatrix_&lt;span class='p'&gt;(&lt;/span&gt;m &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='m'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
6 x 6 sparse Matrix of class &quot;dgCMatrix&quot;
  a b c d e f
a . . . . . 1
b . . . 1 . 1
c . . . . . .
d . . . . . .
e 1 1 . . . .
f . . . 1 . .
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;str&lt;span class='p'&gt;(&lt;/span&gt;M2&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
Formal class 'dgCMatrix' [package &quot;Matrix&quot;] with 6 slots
  ..@ i       : int [1:6] 4 4 1 5 0 1
  ..@ p       : int [1:7] 0 1 2 2 4 4 6
  ..@ Dim     : int [1:2] 6 6
  ..@ Dimnames:List of 2
  .. ..$ : chr [1:6] &quot;a&quot; &quot;b&quot; &quot;c&quot; &quot;d&quot; ...
  .. ..$ : chr [1:6] &quot;a&quot; &quot;b&quot; &quot;c&quot; &quot;d&quot; ...
  ..@ x       : num [1:6] 1 1 1 1 1 1
  ..@ factors : list()
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;identical&lt;span class='p'&gt;(&lt;/span&gt;M1&lt;span class='p'&gt;,&lt;/span&gt; M2&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;
&lt;p&gt;Compare the performance:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;cols &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; c&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;replications&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;elapsed&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;user.self&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;sys.self&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;	
rbenchmark&lt;span class='o'&gt;::&lt;/span&gt;benchmark&lt;span class='p'&gt;(&lt;/span&gt;asdgCMatrix_&lt;span class='p'&gt;(&lt;/span&gt;m &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='m'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; as&lt;span class='p'&gt;(&lt;/span&gt;m&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;dgCMatrix&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;	
                      columns&lt;span class='o'&gt;=&lt;/span&gt;cols&lt;span class='p'&gt;,&lt;/span&gt; order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; replications&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                 test replications elapsed relative user.self sys.self
1 asdgCMatrix_(m * 1)         1000   0.025     1.00     0.024    0.000
2  as(m, &quot;dgCMatrix&quot;)         1000   0.246     9.84     0.240    0.004
&lt;/pre&gt;
&lt;p&gt;For larger matrices the difference in performance gain is smaller:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## 100 x 100 matrix&lt;/span&gt;
nr &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; nc &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;100&lt;/span&gt;
set.seed &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;123&lt;/span&gt;
m  &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;sample&lt;span class='p'&gt;(&lt;/span&gt;c&lt;span class='p'&gt;(&lt;/span&gt;rep&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='m'&gt;9&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;nr&lt;span class='o'&gt;*&lt;/span&gt;nc&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='k-Variable'&gt;T&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; nrow&lt;span class='o'&gt;=&lt;/span&gt;nr&lt;span class='p'&gt;,&lt;/span&gt; ncol&lt;span class='o'&gt;=&lt;/span&gt;nc&lt;span class='p'&gt;)&lt;/span&gt;
rbenchmark&lt;span class='o'&gt;::&lt;/span&gt;benchmark&lt;span class='p'&gt;(&lt;/span&gt;asdgCMatrix_&lt;span class='p'&gt;(&lt;/span&gt;m &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='m'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; as&lt;span class='p'&gt;(&lt;/span&gt;m&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;dgCMatrix&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;	
                      columns&lt;span class='o'&gt;=&lt;/span&gt;cols&lt;span class='p'&gt;,&lt;/span&gt; order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; replications&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;1000&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                 test replications elapsed relative user.self sys.self
1 asdgCMatrix_(m * 1)         1000   0.137    1.000     0.136    0.000
2  as(m, &quot;dgCMatrix&quot;)         1000   0.443    3.234     0.432    0.008
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## 1000 x 1000 matrix&lt;/span&gt;
nr &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; nc &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;1000&lt;/span&gt;
set.seed &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;123&lt;/span&gt;
m  &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;sample&lt;span class='p'&gt;(&lt;/span&gt;c&lt;span class='p'&gt;(&lt;/span&gt;rep&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='m'&gt;9&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;nr&lt;span class='o'&gt;*&lt;/span&gt;nc&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='k-Variable'&gt;T&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; nrow&lt;span class='o'&gt;=&lt;/span&gt;nr&lt;span class='p'&gt;,&lt;/span&gt; ncol&lt;span class='o'&gt;=&lt;/span&gt;nc&lt;span class='p'&gt;)&lt;/span&gt;
rbenchmark&lt;span class='o'&gt;::&lt;/span&gt;benchmark&lt;span class='p'&gt;(&lt;/span&gt;asdgCMatrix_&lt;span class='p'&gt;(&lt;/span&gt;m &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='m'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; as&lt;span class='p'&gt;(&lt;/span&gt;m&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;dgCMatrix&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;	
                      columns&lt;span class='o'&gt;=&lt;/span&gt;cols&lt;span class='p'&gt;,&lt;/span&gt; order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; replications&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                 test replications elapsed relative user.self sys.self
1 asdgCMatrix_(m * 1)          100   1.193    1.000     1.180    0.008
2  as(m, &quot;dgCMatrix&quot;)          100   2.201    1.845     2.064    0.128
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;## 3000 x 3000 matrix&lt;/span&gt;
nr &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; nc &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;3000&lt;/span&gt;
set.seed &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;123&lt;/span&gt;
m  &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;sample&lt;span class='p'&gt;(&lt;/span&gt;c&lt;span class='p'&gt;(&lt;/span&gt;rep&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='m'&gt;9&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;nr&lt;span class='o'&gt;*&lt;/span&gt;nc&lt;span class='p'&gt;,&lt;/span&gt; replace&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='k-Variable'&gt;T&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; nrow&lt;span class='o'&gt;=&lt;/span&gt;nr&lt;span class='p'&gt;,&lt;/span&gt; ncol&lt;span class='o'&gt;=&lt;/span&gt;nc&lt;span class='p'&gt;)&lt;/span&gt;
rbenchmark&lt;span class='o'&gt;::&lt;/span&gt;benchmark&lt;span class='p'&gt;(&lt;/span&gt;asdgCMatrix_&lt;span class='p'&gt;(&lt;/span&gt;m &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='m'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; as&lt;span class='p'&gt;(&lt;/span&gt;m&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;dgCMatrix&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;	
                      columns&lt;span class='o'&gt;=&lt;/span&gt;cols&lt;span class='p'&gt;,&lt;/span&gt; order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; replications&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='m'&gt;100&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
                 test replications elapsed relative user.self sys.self
1 asdgCMatrix_(m * 1)          100   8.911    1.000     6.024    2.828
2  as(m, &quot;dgCMatrix&quot;)          100  21.557    2.419    16.930    4.500
&lt;/pre&gt;
&lt;p&gt;Thanks to Doug Bates for illustrating to me how set the dimnames attribute.&lt;/p&gt;</description>
				<pubDate>Sun, 20 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/sparse-matrix-coercion</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/sparse-matrix-coercion</guid>
			</item>
		
  		<item>
				<title>Robust Estimators of Location and Scale</title>
				<description>&lt;p&gt;First, the &lt;code&gt;median_Rcpp&lt;/code&gt; function is defined to compute the median of the given input vector. It is assumed that the input vector is unsorted, so a copy of the input vector is made using &lt;code&gt;clone&lt;/code&gt; and then &lt;a href='http://en.cppreference.com/w/cpp/algorithm/nth_element'&gt;&lt;code&gt;std::nth_element&lt;/code&gt;&lt;/a&gt; is used to access the &lt;code&gt;nth&lt;/code&gt; sorted element. Since we only care about accessing one sorted element of the vector for an odd length vector and two sorted elements for an even length vector, it is faster to use &lt;code&gt;std::nth_element&lt;/code&gt; than either &lt;code&gt;std::sort&lt;/code&gt; or &lt;code&gt;std::partial_sort&lt;/code&gt;.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='nf'&gt;median_rcpp&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;clone&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
   &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;half&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
   &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;y1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;y2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
   &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;size&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
   &lt;span class='n'&gt;half&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
   &lt;span class='k'&gt;if&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='o'&gt;%&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='c1'&gt;// median for odd length vector&lt;/span&gt;
      &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;nth_element&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;half&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;half&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
   &lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='c1'&gt;// median for even length vector&lt;/span&gt;
      &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;nth_element&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;half&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;end&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
      &lt;span class='n'&gt;y1&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;half&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
      &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;nth_element&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;half&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;begin&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;half&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
      &lt;span class='n'&gt;y2&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;half&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;];&lt;/span&gt;
      &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y1&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;y2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='mf'&gt;2.0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
   &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;library&lt;span class='p'&gt;(&lt;/span&gt;rbenchmark&lt;span class='p'&gt;)&lt;/span&gt;
set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;123&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
z &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; rnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1000000&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

median_rcpp&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 5.5
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;median_rcpp&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;9&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 5
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;# benchmark median_rcpp and median&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;median_rcpp&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;),&lt;/span&gt; median&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;),&lt;/span&gt; order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)[,&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
            test replications elapsed relative
1 median_rcpp(z)          100   1.747    1.000
2      median(z)          100   5.991    3.429
&lt;/pre&gt;
&lt;p&gt;Next, the &lt;code&gt;mad_rcpp&lt;/code&gt; function is defined to compute the median absolute deviation. This is a simple one-liner thanks to the sugar function &lt;code&gt;abs&lt;/code&gt;, the vectorized operators, and the &lt;code&gt;median_rcpp&lt;/code&gt; function defined above. Note that a default value is specified for the scale_factor argument.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='nf'&gt;mad_rcpp&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;double&lt;/span&gt; &lt;span class='n'&gt;scale_factor&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mf'&gt;1.4826&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
   &lt;span class='c1'&gt;// scale_factor = 1.4826; default for normal distribution consistent with R&lt;/span&gt;
   &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;median_rcpp&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;abs&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='n'&gt;median_rcpp&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='n'&gt;scale_factor&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;&lt;span class='c1'&gt;# benchmark mad_rcpp and mad&lt;/span&gt;
benchmark&lt;span class='p'&gt;(&lt;/span&gt;mad_rcpp&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;),&lt;/span&gt; mad&lt;span class='p'&gt;(&lt;/span&gt;z&lt;span class='p'&gt;),&lt;/span&gt; order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)[,&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
         test replications elapsed relative
1 mad_rcpp(z)          100   3.678    1.000
2      mad(z)          100  13.443    3.655
&lt;/pre&gt;</description>
				<pubDate>Sun, 20 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/robust-estimators</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/robust-estimators</guid>
			</item>
		
  		<item>
				<title>Custom as and wrap converters example</title>
				<description>&lt;p&gt;The &lt;a href='http://cran.r-project.org/package=RcppBDT'&gt;RcppBDT package&lt;/a&gt; interfaces &lt;a href='http://www.boost.org/doc/libs/1_52_0/doc/html/date_time.html'&gt;Boost.Date_Time&lt;/a&gt; with R. Both systems have their own date representations&amp;#8212;and this provides a nice example of custom &lt;code&gt;as&amp;lt;&amp;gt;()&lt;/code&gt; and &lt;code&gt;wrap()&lt;/code&gt; converters. Here, we show a simplified example.&lt;/p&gt;

&lt;p&gt;We start with the forward declarations:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;RcppCommon.h&amp;gt;&lt;/span&gt;

&lt;span class='cp'&gt;#include &amp;lt;boost/date_time/gregorian/gregorian_types.hpp&amp;gt; 	&lt;/span&gt;&lt;span class='c1'&gt;// Gregorian calendar types, no I/O&lt;/span&gt;

&lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='c1'&gt;// &amp;#39;date&amp;#39; class boost::gregorian::date&lt;/span&gt;
    &lt;span class='c1'&gt;//&lt;/span&gt;
    &lt;span class='c1'&gt;// non-intrusive extension via template specialisation&lt;/span&gt;
    &lt;span class='k'&gt;template&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt; &lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;dt&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='c1'&gt;//&lt;/span&gt;
    &lt;span class='c1'&gt;// non-intrusive extension via template specialisation&lt;/span&gt;
    &lt;span class='k'&gt;template&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;wrap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;d&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Given these forward declarations, we can now define the converters.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;as()&lt;/code&gt;, we first instantiate a date object and use it to obtain the year, month and day fields to create a &lt;code&gt;boost::gregorian&lt;/code&gt; date.&lt;/p&gt;

&lt;p&gt;Similarly, for the inverse operation, we construct an Rcpp date from these components.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='c1'&gt;// define template specialisations for as and wrap&lt;/span&gt;
&lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;template&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt; &lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;dtsexp&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Date&lt;/span&gt; &lt;span class='n'&gt;dt&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;dtsexp&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;dt&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;getYear&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;dt&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;getMonth&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='n'&gt;dt&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;getDay&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;template&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;wrap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;const&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;d&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;ymd_type&lt;/span&gt; &lt;span class='n'&gt;ymd&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;year_month_day&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;     &lt;span class='c1'&gt;// convert to y/m/d struct&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;wrap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Date&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;ymd&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;year&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ymd&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;month&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ymd&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;day&lt;/span&gt; &lt;span class='p'&gt;));&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With these converters, we can now use a Boost Date_Time function. As a simple example, we use the &lt;em&gt;compute the first given weekday after a date&lt;/em&gt; function.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;Date&lt;/span&gt; &lt;span class='n'&gt;getFirstDayOfWeekAfter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;weekday&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;SEXP&lt;/span&gt; &lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;first_day_of_the_week_after&lt;/span&gt; &lt;span class='n'&gt;fdaf&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;weekday&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt; &lt;span class='n'&gt;dt&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;as&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;gregorian&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;date&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;wrap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='n'&gt;fdaf&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;get_date&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;dt&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can use this to, say, find the first Monday after New Year in 2020:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;getFirstDayOfWeekAfter&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; as.Date&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;2020-01-01&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] &quot;2020-01-06&quot;
&lt;/pre&gt;</description>
				<pubDate>Sun, 20 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/custom-as-and-wrap-example</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/custom-as-and-wrap-example</guid>
			</item>
		
  		<item>
				<title>Using Rcpp to access the C API of xts</title>
				<description>&lt;p&gt;The &lt;a href='https://r-forge.r-project.org/projects/xts/'&gt;xts&lt;/a&gt; package by Jeff Ryan and Josh Ulrich is an immensely powerful tool that is widely used for timeseries work with R. Recently, the question about how to use it from Rcpp came up &lt;a href='http://stackoverflow.com/questions/14274055/how-to-use-c-api-of-xts-package-in-rcpp'&gt;on StackOverflow&lt;/a&gt; and in &lt;a href='http://thread.gmane.org/gmane.comp.lang.r.rcpp/4697'&gt;a thread on the rcpp-devel list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In fact, xts has had an exposed API since 2008, but it wasn&amp;#8217;t used and as I found out also not quite for two key functions. Jeff kindly gave me SVN access, and I updated &lt;code&gt;init.c&lt;/code&gt; (to export) and a new &lt;code&gt;xtsAPI.h&lt;/code&gt; header (access these).&lt;/p&gt;

&lt;p&gt;This short post will show how to access this functionality using the new &lt;a href='http://cran.r-project.org/web/packages/RcppXts/index.html'&gt;RcppXts&lt;/a&gt; package.&lt;/p&gt;

&lt;p&gt;We start by repeating the (updated) &lt;code&gt;createXts()&lt;/code&gt; function from the &lt;a href='../creating-xts-from-c++'&gt;previous post on xts and Rcpp&lt;/a&gt;. This helper function (or an improved version of it) should probably go into RcppXts.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;createXts&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;sv&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='n'&gt;IntegerVector&lt;/span&gt; &lt;span class='n'&gt;ind&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;seq&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sv&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;     &lt;span class='c1'&gt;// values&lt;/span&gt;

    &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;dv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ind&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;               &lt;span class='c1'&gt;// date(time)s are real values&lt;/span&gt;
    &lt;span class='n'&gt;dv&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;dv&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='mi'&gt;86400&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;                     &lt;span class='c1'&gt;// scaled to days&lt;/span&gt;
    &lt;span class='n'&gt;dv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;tzone&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;    &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;UTC&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;         &lt;span class='c1'&gt;// the index has attributes&lt;/span&gt;
    &lt;span class='n'&gt;dv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;tclass&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;   &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ind&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;               &lt;span class='c1'&gt;// data her same index&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;dim&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;         &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;IntegerVector&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;sv&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;index&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;       &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;dv&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;CharacterVector&lt;/span&gt; &lt;span class='n'&gt;klass&lt;/span&gt;  &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;CharacterVector&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;xts&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;zoo&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;class&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;       &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;klass&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;.indexCLASS&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;tclass&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;      &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;.indexTZ&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;    &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;UTC&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;tzone&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;       &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;UTC&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;createXts&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='m'&gt;5&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
           [,1]
1970-01-03    2
1970-01-04    3
1970-01-05    4
1970-01-06    5
&lt;/pre&gt;
&lt;p&gt;Next, we show how to use this. Rcpp attributes will find the xts header file if use a &lt;code&gt;depends()&lt;/code&gt; attribute, and as the functions we access are registered with the surrounding R process, no linking is needed.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='c1'&gt;// next two lines connect us to the xts API&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;xtsAPI.h&amp;gt;&lt;/span&gt;
&lt;span class='c1'&gt;// [[Rcpp::depends(xts)]]&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;rbindXts&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;NumericMatrix&lt;/span&gt; &lt;span class='n'&gt;ma&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;NumericMatrix&lt;/span&gt; &lt;span class='n'&gt;mb&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='n'&gt;dup&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='nb'&gt;true&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='n'&gt;NumericMatrix&lt;/span&gt; &lt;span class='n'&gt;mc&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;xtsRbind&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ma&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;mb&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;wrap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;dup&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;mc&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Thanks to this new (tree-line !!) function, we can combine &lt;code&gt;xts&lt;/code&gt; object at the source level.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;x1 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; createXts&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='m'&gt;5&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
x2 &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; createXts&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='m'&gt;9&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
rbindXts&lt;span class='p'&gt;(&lt;/span&gt;x1&lt;span class='p'&gt;,&lt;/span&gt; x2&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
           [,1]
1970-01-03    2
1970-01-04    3
1970-01-05    4
1970-01-06    5
1970-01-07    6
1970-01-08    7
1970-01-09    8
1970-01-10    9
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;rbindXts&lt;span class='p'&gt;(&lt;/span&gt;x1&lt;span class='p'&gt;,&lt;/span&gt; x2&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;FALSE&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
           [,1]
1970-01-03    2
1970-01-04    3
1970-01-05    4
1970-01-05    4
1970-01-06    5
1970-01-06    5
1970-01-07    6
1970-01-08    7
1970-01-09    8
1970-01-10    9
&lt;/pre&gt;
&lt;p&gt;Notice the difference between the results driven by the third argument about removal of duplicates which has a default value of &lt;code&gt;TRUE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;While this example was obviously very simple, we can see the power and promise of this. It derives from being able to work on large numbers of &lt;code&gt;xts&lt;/code&gt; objects directly at the C++ level without having to call back to R. So even though &lt;a href='https://r-forge.r-project.org/projects/xts/'&gt;xts&lt;/a&gt; is about as efficient as it gets, we should be able to make nice gains (for simple enough tasks) by doing them at the C++ level.&lt;/p&gt;</description>
				<pubDate>Sat, 19 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/accessing-xts-api</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/accessing-xts-api</guid>
			</item>
		
  		<item>
				<title>Using the GSL to compute eigenvalues</title>
				<description>&lt;p&gt;Two posts showed how to compute eigenvalues &lt;a href='../armadillo-eigenvalues'&gt;using Armadillo&lt;/a&gt; and &lt;a href='../eigen-eigenvalues/'&gt;using Eigen&lt;/a&gt;. As we also looked at using the&lt;br /&gt;&lt;a href='http://www.gnu.org/software/gsl/'&gt;GNU GSL&lt;/a&gt;, this post will show how to conpute eigenvalues using GSL.&lt;/p&gt;

&lt;p&gt;As mentioned in the &lt;a href='../gsl-colnorm-example'&gt;previous GSL post&lt;/a&gt;, we instantiate C language pointers suitable for GSL (here the matrix &lt;code&gt;M&lt;/code&gt;). Those &lt;em&gt;must&lt;/em&gt; be freed manually, as shown before the &lt;code&gt;return&lt;/code&gt; statement.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='c1'&gt;// [[Rcpp::depends(RcppGSL)]]&lt;/span&gt;

&lt;span class='cp'&gt;#include &amp;lt;RcppGSL.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;gsl/gsl_matrix.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;gsl/gsl_eigen.h&amp;gt;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;getEigenValues&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;NumericMatrix&lt;/span&gt; &lt;span class='n'&gt;sM&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='n'&gt;RcppGSL&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;matrix&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='kt'&gt;double&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;M&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sM&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; 	&lt;span class='c1'&gt;// create gsl data structures from SEXP&lt;/span&gt;
    &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;k&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;M&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;ncol&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

    &lt;span class='n'&gt;RcppGSL&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;vector&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='kt'&gt;double&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;k&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;  	&lt;span class='c1'&gt;// instead of gsl_vector_alloc(k);&lt;/span&gt;
    &lt;span class='n'&gt;gsl_eigen_symm_workspace&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;w&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;gsl_eigen_symm_alloc&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;k&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;gsl_eigen_symm&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;M&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;w&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;gsl_eigen_symm_free&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;w&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='c1'&gt;// we need to invoke wrap() here to help the compiler, but at least we save a loop&lt;/span&gt;
    &lt;span class='c1'&gt;// we also need to create a new Rcpp object as the RcppGSL one needs to be free&amp;#39;d.&lt;/span&gt;
    &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;res&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;wrap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;

    &lt;span class='n'&gt;M&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;free&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;               		&lt;span class='c1'&gt;// important: GSL wrappers use C structure&lt;/span&gt;
    &lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;free&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;res&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;				&lt;span class='c1'&gt;// return results vector  &lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can illustrate this easily via a random sample matrix.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;42&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
X &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; matrix&lt;span class='p'&gt;(&lt;/span&gt;rnorm&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
Z &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; X &lt;span class='o'&gt;%*%&lt;/span&gt; t&lt;span class='p'&gt;(&lt;/span&gt;X&lt;span class='p'&gt;)&lt;/span&gt;

getEigenValues&lt;span class='p'&gt;(&lt;/span&gt;Z&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] 14.2100  2.4099  1.6856  0.3319
&lt;/pre&gt;
&lt;p&gt;In comparison, R gets the same results (in reverse order) and also returns the eigenvectors.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;eigen&lt;span class='p'&gt;(&lt;/span&gt;Z&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
$values
[1] 14.2100  2.4099  1.6856  0.3319

$vectors
         [,1]     [,2]    [,3]     [,4]
[1,]  0.69988 -0.55799  0.4458 -0.00627
[2,] -0.06833 -0.08433  0.0157  0.99397
[3,]  0.44100 -0.15334 -0.8838  0.03127
[4,]  0.55769  0.81118  0.1413  0.10493
&lt;/pre&gt;</description>
				<pubDate>Fri, 18 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/gsl-for-eigenvalues</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/gsl-for-eigenvalues</guid>
			</item>
		
  		<item>
				<title>Creating xts objects from source</title>
				<description>&lt;p&gt;A recent post showed how to access the &lt;a href='../getting-attributes-for-xts-example/'&gt;attributes of an xts object&lt;/a&gt;. We used an &lt;code&gt;xts&lt;/code&gt; object as these are powerful and popular&amp;#8212;but any R object using attributed could be used to illustrate the point.&lt;/p&gt;

&lt;p&gt;In this short post, we show how one can also do the inverse in order to &lt;em&gt;create&lt;/em&gt; an xts object at the C++ source level.&lt;/p&gt;

&lt;p&gt;We use a somewhat useless object with values from &lt;code&gt;1:10&lt;/code&gt; index by dates in the same range. As zero corresponds to the epoch, these will be early 1970-dates. But the values do not matter when showing the principle.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;createXts&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;sv&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='n'&gt;IntegerVector&lt;/span&gt; &lt;span class='n'&gt;ind&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;seq&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sv&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;     &lt;span class='c1'&gt;// values&lt;/span&gt;

    &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;dv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ind&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;               &lt;span class='c1'&gt;// date(time)s are real values&lt;/span&gt;
    &lt;span class='n'&gt;dv&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;dv&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='mi'&gt;86400&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;                     &lt;span class='c1'&gt;// scaled to days&lt;/span&gt;
    &lt;span class='n'&gt;dv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;tzone&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;    &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;UTC&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;         &lt;span class='c1'&gt;// the index has attributes&lt;/span&gt;
    &lt;span class='n'&gt;dv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;tclass&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;   &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ind&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;               &lt;span class='c1'&gt;// data her same index&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;dim&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;         &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;IntegerVector&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ev&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;sv&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;index&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;       &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;dv&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;CharacterVector&lt;/span&gt; &lt;span class='n'&gt;klass&lt;/span&gt;  &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;CharacterVector&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;xts&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;zoo&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;class&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;       &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;klass&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;.indexCLASS&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;tclass&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;      &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;.indexTZ&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;    &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;UTC&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;attr&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;tzone&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;       &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;UTC&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;xv&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can run this function, and look at the (numerous) attributes in the generated object:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;suppressMessages&lt;span class='p'&gt;(&lt;/span&gt;library&lt;span class='p'&gt;(&lt;/span&gt;xts&lt;span class='p'&gt;))&lt;/span&gt;
foo &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; createXts&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; 
foo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
           [,1]
1970-01-02    1
1970-01-03    2
1970-01-04    3
1970-01-05    4
1970-01-06    5
1970-01-07    6
1970-01-08    7
1970-01-09    8
1970-01-10    9
1970-01-11   10
&lt;/pre&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;attributes&lt;span class='p'&gt;(&lt;/span&gt;foo&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
$dim
[1] 10  1

$index
 [1]  86400 172800 259200 345600 432000 518400 604800 691200 777600 864000
attr(,&quot;tzone&quot;)
[1] &quot;UTC&quot;
attr(,&quot;tclass&quot;)
[1] &quot;Date&quot;

$class
[1] &quot;xts&quot; &quot;zoo&quot;

$.indexCLASS
[1] &quot;Date&quot;

$tclass
[1] &quot;Date&quot;

$.indexTZ
[1] &quot;UTC&quot;

$tzone
[1] &quot;UTC&quot;
&lt;/pre&gt;
&lt;p&gt;It turns out that creating an &lt;code&gt;xts&lt;/code&gt; object the usual way creates an object that is equal:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;bar &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; xts&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; order.by&lt;span class='o'&gt;=&lt;/span&gt;as.Date&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; 
all.equal&lt;span class='p'&gt;(&lt;/span&gt;foo&lt;span class='p'&gt;,&lt;/span&gt; bar&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
[1] TRUE
&lt;/pre&gt;
&lt;p&gt;So now we can create &lt;code&gt;xts&lt;/code&gt; objects at the source level.&lt;/p&gt;

&lt;p&gt;Upated to add &lt;code&gt;sv&lt;/code&gt; and &lt;code&gt;ev&lt;/code&gt; start and end values.&lt;/p&gt;</description>
				<pubDate>Thu, 17 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/creating-xts-from-c%2B%2B</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/creating-xts-from-c%2B%2B</guid>
			</item>
		
  		<item>
				<title>Timing normal RNGs</title>
				<description>&lt;p&gt;In previous articles, we have seen that Rcpp can be particularly useful for simulations as it executes code at C++ speed. A very useful feature the API provided by R is the access to the R RNGs so that simulations at the C++ level can get precisely the same stream of random numbers as an R application would.&lt;/p&gt;

&lt;p&gt;But sometimes that is not a requirement, and here will look into drawing normals from R, from the random number generator in Boost and the new one in C++11.&lt;/p&gt;

&lt;p&gt;A first approach is by far the easiest: using Rcpp and its sugar function which reduces this to a single statement.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;rcppNormals&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;RNGScope&lt;/span&gt; &lt;span class='n'&gt;scope&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;             &lt;span class='c1'&gt;// also done by sourceCpp()&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;rnorm&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A quick test:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;set.seed&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;42&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
rcppNormals&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
 [1]  1.37096 -0.56470  0.36313  0.63286  0.40427 -0.10612  1.51152
 [8] -0.09466  2.01842 -0.06271
&lt;/pre&gt;
&lt;p&gt;Next, the same via Boost. The caveats from the previous two Boost pieces apply: on some systems you may have to ensure access to the Boost headers, on some (such as my Linux system) it just works.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;

&lt;span class='cp'&gt;#include &amp;lt;boost/random.hpp&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;boost/generator_iterator.hpp&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;boost/random/normal_distribution.hpp&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;boostNormals&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    
    &lt;span class='k'&gt;typedef&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;mt19937&lt;/span&gt; &lt;span class='n'&gt;RNGType&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; 	&lt;span class='c1'&gt;// select a generator, MT good default&lt;/span&gt;
    &lt;span class='n'&gt;RNGType&lt;/span&gt; &lt;span class='n'&gt;rng&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;123456&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;			&lt;span class='c1'&gt;// instantiate and seed&lt;/span&gt;

    &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;normal_distribution&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;n01&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;variate_generator&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;RNGType&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;boost&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;normal_distribution&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;rngNormal&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;rng&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;n01&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;V&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;V&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;rngNormal&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='p'&gt;};&lt;/span&gt;
  
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;V&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A second test:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;boostNormals&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
 [1]  0.8400  0.8610  2.0907 -0.4437 -0.1029  1.5609  1.3874 -1.0453
 [9] -1.6558  1.6198
&lt;/pre&gt;
&lt;p&gt;And now for the same using the random number generator added to C++11. Here, the same caveats apply as before: we need to enable the C++11 extensions:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;Sys.setenv&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;PKG_CXXFLAGS&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;-std=c++11&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='c1'&gt;# or&lt;/span&gt;
&lt;span class='c1'&gt;# Sys.setenv(&amp;quot;PKG_CXXFLAGS&amp;quot;=&amp;quot;-std=c++0x&amp;quot;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That way, we can compile this code:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='cpp'&gt;&lt;span class='cp'&gt;#include &amp;lt;Rcpp.h&amp;gt;&lt;/span&gt;
&lt;span class='cp'&gt;#include &amp;lt;random&amp;gt;&lt;/span&gt;

&lt;span class='k'&gt;using&lt;/span&gt; &lt;span class='k'&gt;namespace&lt;/span&gt; &lt;span class='n'&gt;Rcpp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

&lt;span class='c1'&gt;// [[Rcpp::export]]&lt;/span&gt;
&lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='nf'&gt;cxx11Normals&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;mt19937&lt;/span&gt; &lt;span class='n'&gt;engine&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;42&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='n'&gt;std&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='n'&gt;normal_distribution&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;normal&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mf'&gt;0.0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mf'&gt;1.0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='n'&gt;NumericVector&lt;/span&gt; &lt;span class='n'&gt;V&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;V&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;normal&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;engine&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;};&lt;/span&gt;

    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='n'&gt;V&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And run it:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;cxx11Normals&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
 [1] -0.5502  0.5154  0.4739  1.3685 -0.9168 -0.1241 -2.0110 -0.4928
 [9]  0.3926 -0.9292
&lt;/pre&gt;
&lt;p&gt;Lastly, we can compare the runtime for these three in a quick benchmark study.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='r'&gt;library&lt;span class='p'&gt;(&lt;/span&gt;rbenchmark&lt;span class='p'&gt;)&lt;/span&gt;

n &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='m'&gt;1e5&lt;/span&gt;

res &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; benchmark&lt;span class='p'&gt;(&lt;/span&gt;rcppNormals&lt;span class='p'&gt;(&lt;/span&gt;n&lt;span class='p'&gt;),&lt;/span&gt;
                 boostNormals&lt;span class='p'&gt;(&lt;/span&gt;n&lt;span class='p'&gt;),&lt;/span&gt;
                 cxx11Normals&lt;span class='p'&gt;(&lt;/span&gt;n&lt;span class='p'&gt;),&lt;/span&gt;
                 order&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                 replications &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;500&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
print&lt;span class='p'&gt;(&lt;/span&gt;res&lt;span class='p'&gt;[,&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='m'&gt;4&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre class='output'&gt;
             test replications elapsed relative
3 cxx11Normals(n)          500   3.764    1.000
1  rcppNormals(n)          500   4.102    1.090
2 boostNormals(n)          500   4.353    1.156
&lt;/pre&gt;
&lt;p&gt;In this particularly example, all the RNGs take roughly the same time. It would be interesting to see how the Ziggurat algorithm (which is known to produce Normals rather fast) would fare.&lt;/p&gt;</description>
				<pubDate>Wed, 16 Jan 2013 00:00:00 -0800</pubDate>
				<link>http://gallery.rcpp.org//articles/timing-normal-rngs</link>
				<guid isPermaLink="true">http://gallery.rcpp.org//articles/timing-normal-rngs</guid>
			</item>
		
	</channel>
</rss>


