One solution: X.row(ii) is actually generating a CharacterMatrix::Row ; ie, a view of that row in the CharacterMatrix, and I think you need to explicitly copy it to a CharacterVector and then assign that CharacterVector to the list.<div>
<br></div><div>You could write something like:</div><div><br></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">src <- '</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  CharacterMatrix X(XX_);</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  int Nx = X.nrow();</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  List ans;</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  for (int ii=0; ii<Nx; ii++) {</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">    CharacterMatrix::Row view = X.row(ii);</span></div>
<div>    CharacterVector tmp = no_init( X.ncol() );</div><div>    for( int j=0; j < X.ncol(); j++ ) {</div><div>      tmp[j] = view[j];</div><div>    }</div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">    ans.push_back( tmp );</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  }</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  return(wrap(ans));</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">'</span> </div><div><br></div><div>although it is a bit clunkier. I'm not sure if there's a more idiomatic method available.</div>
<div><br></div><div>FWIW, trying to copy and assign directly, e.g. 'CharacterVector tmp = X.row(ii);', doesn't seem to work, even though the same code works (and is in the quick-start vignette) for NumericVector.</div>
<div><br></div><div>-Kevin<br><br><div class="gmail_quote">On Mon, Feb 18, 2013 at 3:37 PM, Søren Højsgaard <span dir="ltr"><<a href="mailto:sorenh@math.aau.dk" target="_blank">sorenh@math.aau.dk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I want to split a matrix by its rows into a list as:<br>
> a<- matrix(letters[1:6],ncol=2)<br>
> split(a,row(a))<br>
$`1`<br>
[1] "a" "d"<br>
<br>
$`2`<br>
[1] "b" "e"<br>
<br>
$`3`<br>
[1] "c" "f"<br>
<br>
I do as follows and get a strange result. Any suggestions?<br>
<br>
Thanks in advance!<br>
Søren<br>
<br>
---------------<br>
<br>
src <- '<br>
  CharacterMatrix X(XX_);<br>
  int Nx = X.nrow();<br>
  List ans;<br>
  for (int ii=0; ii<Nx; ii++){<br>
    ans.push_back(X.row(ii));<br>
  }<br>
  return(wrap(ans));<br>
'<br>
split_ <- cxxfunction(signature(XX_="matrix"), plugin="Rcpp", body=src)<br>
<br>
split_(a)<br>
<br>
[[1]]<br>
[[1]][[1]]<br>
<CHARSXP: "a"><br>
<br>
[[1]][[2]]<br>
<CHARSXP: "d"><br>
<br>
<br>
[[2]]<br>
[[2]][[1]]<br>
<CHARSXP: "b"><br>
<br>
[[2]][[2]]<br>
<CHARSXP: "e"><br>
<br>
<br>
[[3]]<br>
[[3]][[1]]<br>
<CHARSXP: "c"><br>
<br>
[[3]][[2]]<br>
<CHARSXP: "f"><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>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
</blockquote></div><br></div>