[Rcpp-devel] Data Persistence when using inline
Noah Silverman
noahsilverman at ucla.edu
Thu Sep 8 03:12:31 CEST 2011
Darren,
That's an awesome answer!
Thank you very much!!!!
--
Noah Silverman
UCLA Department of Statistics
8117 Math Sciences Building
Los Angeles, CA 90095
On Sep 7, 2011, at 6:04 PM, Darren Cook wrote:
>> If the code was in pure C++, it would be trivial to have an object
>> and then just pass a pointer to that object. I can't figure out how
>> to do the same thing with R+Rcpp+inline.
>
> I asked myself a similar question a few weeks back (actually it came
> from one of the questions at the end of the google talk [1] and, while
> both Dirk and Romain confidently said it was possible, at the time I
> couldn't see how to actually do it).
>
> I think what you're looking for is Rcpp::XPtr. I.e. you have your C++
> code allocate and *own* the memory, and then it passes it back to R by
> wrapping it in XPtr. XPtr is a curious template as it does two distinct
> tasks: it returns a C++ pointer to R, and it also turns an R object back
> into a C++ pointer.
>
> Below is the proof-of-concept example I came up with. I use a custom
> class (the real point of this example), but it could just as well be
> std::vector. This example also shows a couple of other things:
>
> 1. Keeping the C++ class code in its own files.
>
> 2. Compiling two functions at once; this isn't necessary for this
> example, it is just quicker. (test5b.R is also included below, and shows
> how to do this with two separate compiler invocations.)
>
> (BTW, this example leaks memory. For long-running production code don't
> forget that your C++ code owns the memory and is responsible for
> deleting it.)
>
> Darren
>
> [1]: http://www.youtube.com/watch?v=UZkaZhsOfT4
>
>
> --------- test5.R ---------------
>
> library('inline')
>
> header=paste(readLines("test5.h"),collapse="\n")
> src=paste(readLines("test5.cpp"),collapse="\n")
>
> use_src='
> Rcpp::XPtr< Example > xp(xp_); //I.e. Example xp=xp_;
> return wrap(xp->a + xp->b);
> '
>
> fun=cxxfunction(
> list(create=signature(),use=signature(xp_="externalptr")),
> list(create=src,use=use_src),
> includes=header,
> plugin="Rcpp"
> );
>
> xp=fun$create() #xp is an Example object
> print(xp)
> print(fun$use(xp))
>
>
> -------- test5.h ------------------------
>
> class Example{
> public:
> int a,b;
>
> public:
> Example(int a_,int b_):a(a_),b(b_){}
>
> };
>
> using namespace Rcpp;
>
>
> -------- test5.cpp ------------------------
>
> Example *xp=new Example(10,20);
> return XPtr<Example>(xp,true);
>
>
> -------- test5b.R --------------------------
>
> library('inline')
>
> header=paste(readLines("test5.h"),collapse="\n")
> src=paste(readLines("test5.cpp"),collapse="\n")
>
> use_src='
> Rcpp::XPtr< Example > xp(xp_); //I.e. Example xp=xp_;
> return wrap(xp->a + xp->b);
> '
>
> fun_create=cxxfunction(
> signature(),
> src,
> includes=header,
> plugin="Rcpp"
> );
>
> fun_use=cxxfunction(
> signature(xp_="externalptr"),
> use_src,
> includes=header,
> plugin="Rcpp"
> );
>
> xp=fun_create() #xp is an Example object
> print(xp)
> print(fun_use(xp))
>
>
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20110907/ac84fd1a/attachment.htm>
More information about the Rcpp-devel
mailing list