<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi Douglas,<div><br></div><div>I've tried that: Rcpp::S4 res(Rcpp::clone(Rcpp::S4(obj.slot("results")));</div><div><br></div><div>But it doesn't solve the problem because you actually clone the reference returned by the copy constructor...</div><div><br></div><div>Rémi</div><div><br><div><div>Le 16 févr. 2012 à 17:25, Douglas Bates a écrit :</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>On Thu, Feb 16, 2012 at 9:25 AM, Rémi Lebret<br><<a href="mailto:remi.lebret@math.univ-lille1.fr">remi.lebret@math.univ-lille1.fr</a>> wrote:<br><blockquote type="cite">Hi,<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I've got some issues by using the copy constructor of the S4 class.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I want to make a copy of a S4 object but it looks like the copy constructor<br></blockquote><blockquote type="cite">returns a reference instead of a new instance of the S4 class.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I made a dummy example to illustrate my problem:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">##############################################################<br></blockquote><blockquote type="cite">setClass(<br></blockquote><blockquote type="cite">  Class="ResultObject",<br></blockquote><blockquote type="cite">  representation=representation(<br></blockquote><blockquote type="cite">    data = "numeric"<br></blockquote><blockquote type="cite">  ),<br></blockquote><blockquote type="cite">  prototype=prototype(<br></blockquote><blockquote type="cite">    data = numeric(0)<br></blockquote><blockquote type="cite">  )<br></blockquote><blockquote type="cite">)<br></blockquote><blockquote type="cite">##############################################################<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">##############################################################<br></blockquote><blockquote type="cite">setClass(<br></blockquote><blockquote type="cite">  Class="TestObject",<br></blockquote><blockquote type="cite">  representation=representation(<br></blockquote><blockquote type="cite">    size = "numeric",<br></blockquote><blockquote type="cite">    results = "ResultObject"<br></blockquote><blockquote type="cite">  ),<br></blockquote><blockquote type="cite">  prototype=prototype(<br></blockquote><blockquote type="cite">    size = numeric(0),<br></blockquote><blockquote type="cite">    results = new("ResultObject")<br></blockquote><blockquote type="cite">  )<br></blockquote><blockquote type="cite">)<br></blockquote><blockquote type="cite">##############################################################<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">##############################################################<br></blockquote><blockquote type="cite">src <- '<br></blockquote><blockquote type="cite">  Rcpp::S4 obj(S4Object);<br></blockquote><blockquote type="cite">  // get the size<br></blockquote><blockquote type="cite">  int n = obj.slot("size");<br></blockquote><blockquote type="cite">  // get a copy of the ResultObject by calling the copy constructor<br></blockquote><blockquote type="cite">  // --> but here it looks like a reference not a copy ?<br></blockquote><blockquote type="cite">  Rcpp::S4 res(obj.slot("results"));<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">  // if size is greater than create a list of results<br></blockquote><blockquote type="cite">  if ( n > 1 ){<br></blockquote><blockquote type="cite">    // create a new list<br></blockquote><blockquote type="cite">    Rcpp::List resList(n);<br></blockquote><blockquote type="cite">    // loop over the results<br></blockquote><blockquote type="cite">    for (int i=0; i<n; i++ ){<br></blockquote><blockquote type="cite">      // save results into the S4 object<br></blockquote><blockquote type="cite">      res.slot("data") = i;<br></blockquote><blockquote type="cite">      // copy the S4 object into the list -->  so it looks like a copy of a<br></blockquote><blockquote type="cite">reference here...<br></blockquote><blockquote type="cite">      resList[i]=res;<br></blockquote><blockquote type="cite">    }<br></blockquote><blockquote type="cite">    // set the list to our S4 object<br></blockquote><blockquote type="cite">    obj.slot("results") = resList;<br></blockquote><blockquote type="cite">  }<br></blockquote><blockquote type="cite">  // otherwise store only one result<br></blockquote><blockquote type="cite">  else if ( n == 1 ){<br></blockquote><blockquote type="cite">    res.slot("data") = 1;<br></blockquote><blockquote type="cite">     obj.slot("results") = res;<br></blockquote><blockquote type="cite">  }<br></blockquote><blockquote type="cite">  // return the S4 object<br></blockquote><blockquote type="cite">  return obj;<br></blockquote><blockquote type="cite">'<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">testList <- cxxfunction(signature(S4Object="TestObject"), src, plugin =<br></blockquote><blockquote type="cite">"Rcpp")<br></blockquote><blockquote type="cite">##############################################################<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"># test with 3 elements<br></blockquote><blockquote type="cite"># all data slot will contain the same value, that's not what we expect<br></blockquote><blockquote type="cite">test1<-new("TestObject", size=3)<br></blockquote><blockquote type="cite">testList(test1)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"># test with only one element<br></blockquote><blockquote type="cite">test2<-new("TestObject", size=1)<br></blockquote><blockquote type="cite">testList(test2)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Any idea how to make a copy of a S4 object?<br></blockquote><br>You probably want to clone the object, not use the copy constructor.<br>That is, (not tested)<br><br>Rcpp::S4 res(Rcpp::clone(obj.slot("results"));<br></div></blockquote></div><br><div>
<font face="Courier New" size="3">
Rémi Lebret<br>
Ingénieur de recherche CNRS<br>
Laboratoire de mathématiques de Lille1 - UMR 8524<br>
Batiment M3 - Bureau 322<br>
Tel: 03 20 43 67 82<br>
<a href="mailto:remi.lebret@math.univ-lille1.fr">remi.lebret@math.univ-lille1.fr</a><br>
</font>


</div>
<br></div></body></html>