<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On 2012-11-26, at 1:10 AM, <a href="mailto:romain@r-enthusiasts.com">romain@r-enthusiasts.com</a> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Le 2012-11-26 06:19, Davor Cubranic a écrit :<br><blockquote type="cite">Although DataFrame is a subclass of List, it's missing a few handy<br></blockquote><blockquote type="cite">constructors that List (i.e., Vector) have, such as "(const int&<br></blockquote><blockquote type="cite">size)" to pre-allocate the space for it.<br></blockquote><br>So that you would have `size` columns, but how many rows, of which types are the rows.<br></div></blockquote><div><br></div>But this constructor only preallocates the space for the list, and the size is still 0 until you add elements to it. I don't see why types of rows (or columns) matter, or even how many rows there are as long as they are all the same.</div><div><br><blockquote type="cite"><div>I'd suggest you have a look at one of the DataFrame::create<br></div></blockquote><div><br></div>`create` is only useful if I know the contents of the data frame at compile time. In this case, until runtime I don't know how many columns there are, their names, types, or the number of rows -- except that all columns have the same number of rows. I've seen questions on this code pattern come up regularly here, so I can't be the only one using it. The standard response is "build it as a List and then convert it to a DataFrame at the end", and that's what's worked for me for a long time, except that I now discovered that this won't carry over the "row.names" attribute. So I can't do something like this:</div><div><br></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>cppFunction('#include <vector></div></div><div><div>DataFrame foo2(CharacterVector x, NumericVector y) {</div></div><div><div>  List foo(2);</div><div>  foo[0] = x;</div><div>  foo[1] = y;</div><div><br></div><div>  std::string names[] = {"x", "y"};</div></div><div><div>  foo.attr("names") = std::vector<std::string>(names, names+2);</div></div><div><div><br></div></div><div><div>  foo.attr("row.names") = x;</div></div><div><div><br></div></div><div><div>  return DataFrame(foo);</div></div><div><div>}')</div></div><div><div><br></div></div><div><div>foo2(letters[1:2], 3:4)</div></div></blockquote><div><div><br></div><div>But instead have to do this:</div><div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>cppFunction('#include <vector></div></div><div><div>List foo3(CharacterVector x, NumericVector y) {</div></div><div><div>  List foo(2);</div><div>  foo[0] = x;</div><div>  foo[1] = y;</div><div><br></div><div>  std::string names[] = {"x", "y"};</div></div><div><div>  foo.attr("names") = std::vector<std::string>(names, names+2);</div></div><div><div><br></div></div><div><div>  DataFrame fooDf(foo);</div></div><div><div>  fooDf.attr("row.names") = x;</div></div><div><div><br></div></div><div><div>  return fooDf;</div></div><div><div>}')</div></div><div><div><br></div></div><div><div><div>foo3(letters[1:2], 3:4)</div></div></div></blockquote><div><div><div><br></div></div><div>Having that extra variable towards the end sticks out like a sore thumb and makes me wonder why couldn't I do this:</div><div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>cppFunction('#include <vector></div></div><div><div>DataFrame foo4(CharacterVector x, NumericVector y) {</div></div><div><div>  DataFrame foo; // or even better: foo(2);</div></div><div><div>  foo[0] = x;</div></div><div><div>  foo[1] = y;</div></div><div><div>  </div></div><div><div>  std::string names[] = {"x", "y"};</div></div><div><div>  foo.attr("names") = std::vector<std::string>(names, names+2);</div></div><div><div><br></div></div><div><div>  foo.attr("row.names") = x;</div></div><div><div><br></div></div><div><div>  return foo;</div></div><div><div>}')</div></div><div><div><br></div></div><div><div><div><div><div>foo4(letters[1:2], 3:4)</div></div></div></div></div></blockquote><div><div><div><div></div></div></div><div><br></div><div>This is not that different from what we'd do in R, right?</div><div><br></div><div>Davor</div><div><br></div></div></body></html>