[R] Rcpp Starter With Carry Class
    ivo welch 
    ivo.welch at anderson.ucla.edu
       
    Tue May 28 20:41:05 CEST 2013
    
    
  
I read Hadley's excellent Rcpp tutorial at
https://github.com/hadley/devtools/wiki/Rcpp.  Alas, there is one part
that is missing---how do I maintain a memory region between calls?
Here is a stylized example of what I mean:
extern "C" {
#include <stdio.h>
#include <math.h>
}
#include <new>
class silly {
  double *v; int k;
public:
  silly(int i) { k= i; v= new double[k]; }
  ~silly() { delete [] v; }
  void update( int x1 ) { for (int i=0; i<k; ++i) v[i]= v[i]+pow(x1,i); }
  int show() { for (int i=0; i<k; ++i) printf("i[%d]=%lf\n", i, v[i]);
  return k; }
};
// the C++ version of what we will want to do
int main() {  silly s(5);  s.update( 1 );  s.update( 2 );  s.show();
return 0; }
### intended Rcpp syntax;  I know I could do this by using R
attributes from Rcpp,
### but I want to learn how to keep my storage in C++ and update in place.
demonstrate <- function() {
  x <- silly(5)
  x <- update(x, 1)
  x <- update(x, 2)
  show(x)
}
I presume as far as R is concerned, heap-allocated memory is outside
its domain, so my *v vector is fine.  is there a "Pointer" type that I
could define and schlepp through various invokations in R?
I am thinking
  RLeaveMeAlonePointer silly(int i) {
      RLeaveMeAlonePointer out;
      out.attr("class") = "silly";
      return out;
  }
and is R smart enough to call C++ ~silly() when the last reference to
x disappears?
and is the overhead of a C++ call low or high?
/iaw
----
Ivo Welch (ivo.welch at gmail.com)
    
    
More information about the R-help
mailing list