<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Darren,<div><br></div><div>That's an awesome answer!&nbsp;</div><div><br></div><div>Thank you very much!!!!</div><div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>--</div><div>Noah Silverman</div><div>UCLA Department of Statistics</div><div>8117 Math Sciences Building</div><div>Los Angeles, CA 90095</div></div></div></span></span>
</div>
<br><div><div>On Sep 7, 2011, at 6:04 PM, Darren Cook wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div><blockquote type="cite">If the code was in pure C++, it would be trivial to have an object<br></blockquote><blockquote type="cite">and then just pass a pointer to that object. &nbsp;I can't figure out how<br></blockquote><blockquote type="cite">to do the same thing with R+Rcpp+inline.<br></blockquote><br>I asked myself a similar question a few weeks back (actually it came<br>from one of the questions at the end of the google talk [1] and, while<br>both Dirk and Romain confidently said it was possible, at the time I<br>couldn't see how to actually do it).<br><br>I think what you're looking for is Rcpp::XPtr. I.e. you have your C++<br>code allocate and *own* the memory, and then it passes it back to R by<br>wrapping it in XPtr. XPtr is a curious template as it does two distinct<br>tasks: it returns a C++ pointer to R, and it also turns an R object back<br>into a C++ pointer.<br><br>Below is the proof-of-concept example I came up with. I use a custom<br>class (the real point of this example), but it could just as well be<br>std::vector. This example also shows a couple of other things:<br><br> &nbsp;1. Keeping the C++ class code in its own files.<br><br> &nbsp;2. Compiling two functions at once; this isn't necessary for this<br>example, it is just quicker. (test5b.R is also included below, and shows<br>how to do this with two separate compiler invocations.)<br><br>(BTW, this example leaks memory. For long-running production code don't<br>forget that your C++ code owns the memory and is responsible for<br>deleting it.)<br><br>Darren<br><br>[1]: <a href="http://www.youtube.com/watch?v=UZkaZhsOfT4">http://www.youtube.com/watch?v=UZkaZhsOfT4</a><br><br><br>--------- test5.R ---------------<br><br>library('inline')<br><br>header=paste(readLines("test5.h"),collapse="\n")<br>src=paste(readLines("test5.cpp"),collapse="\n")<br><br>use_src='<br>Rcpp::XPtr&lt; Example &gt; xp(xp_); //I.e. Example xp=xp_;<br>return wrap(xp-&gt;a + xp-&gt;b);<br>'<br><br>fun=cxxfunction(<br> &nbsp;&nbsp;&nbsp;list(create=signature(),use=signature(xp_="externalptr")),<br> &nbsp;&nbsp;&nbsp;list(create=src,use=use_src),<br> &nbsp;&nbsp;&nbsp;includes=header,<br> &nbsp;&nbsp;&nbsp;plugin="Rcpp"<br> &nbsp;&nbsp;&nbsp;);<br><br>xp=fun$create() &nbsp;&nbsp;&nbsp;#xp is an Example object<br>print(xp)<br>print(fun$use(xp))<br><br><br>-------- test5.h ------------------------<br><br>class Example{<br>public:<br>int a,b;<br><br>public:<br>Example(int a_,int b_):a(a_),b(b_){}<br><br>};<br><br>using namespace Rcpp;<br><br><br>-------- test5.cpp ------------------------<br><br>Example *xp=new Example(10,20);<br>return XPtr&lt;Example&gt;(xp,true);<br><br><br>-------- test5b.R --------------------------<br><br>library('inline')<br><br>header=paste(readLines("test5.h"),collapse="\n")<br>src=paste(readLines("test5.cpp"),collapse="\n")<br><br>use_src='<br>Rcpp::XPtr&lt; Example &gt; xp(xp_); //I.e. Example xp=xp_;<br>return wrap(xp-&gt;a + xp-&gt;b);<br>'<br><br>fun_create=cxxfunction(<br> &nbsp;&nbsp;&nbsp;signature(),<br> &nbsp;&nbsp;&nbsp;src,<br> &nbsp;&nbsp;&nbsp;includes=header,<br> &nbsp;&nbsp;&nbsp;plugin="Rcpp"<br> &nbsp;&nbsp;&nbsp;);<br><br>fun_use=cxxfunction(<br> &nbsp;&nbsp;&nbsp;signature(xp_="externalptr"),<br> &nbsp;&nbsp;&nbsp;use_src,<br> &nbsp;&nbsp;&nbsp;includes=header,<br> &nbsp;&nbsp;&nbsp;plugin="Rcpp"<br> &nbsp;&nbsp;&nbsp;);<br><br>xp=fun_create() &nbsp;&nbsp;&nbsp;#xp is an Example object<br>print(xp)<br>print(fun_use(xp))<br><br><br>_______________________________________________<br>Rcpp-devel mailing list<br><a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel<br></div></blockquote></div><br></div></body></html>