Perhaps this will narrow down the 'why as seems to fail'. I'm looking at the Rcpp 0.10.2 source. (hopefully I've got this right):<div><br></div><div>Rcpp's 'as' uses ::Rf_isString to check whether the item passed is a string; or more specifically, a STRSXP. However, elements within a CharacterVector seem to be of 'type' CHARSXP, and hence fail this test, and throw that exception.</div>
<div><br></div><div>This is kind of surprising since I thought CharacterVectors / StringVectors were defined as (high-level) containers for STRSXPs ? Certainly, that's what we see in Rcpp/instantiation.h ...</div><div>
<br></div><div>Sample code:</div><div><br></div><div><div>#include <Rcpp.h></div><div>using namespace Rcpp;</div><div><br></div><div>// [[Rcpp::export]]</div><div>StringVector check( StringVector x ) {</div><div>  Rcout << "The type of x is: " << ::TYPEOF( x ) << std::endl;</div>
<div>  Rcout << "The type of x(0) is: " << ::TYPEOF( x(0) ) << std::endl;</div><div>  Rcout << "The integer associated with STRSXPs is: " << STRSXP << std::endl;</div>
<div>  Rcout << "The integer associated with CHARSXPs is: " << CHARSXP << std::endl;</div><div>  Rcout << "Is x a string?: " << ::Rf_isString(x) << std::endl;</div><div>
  Rcout << "Is x(0) a string?: " << ::Rf_isString(x(0)) << std::endl;</div><div>  return x;</div><div>}</div><div><br></div><div>/*** R</div><div>check( c("a", "b", "c") )</div>
<div>*/</div></div><div><br></div><div>gives me</div><div><br></div><div><div>The type of x is: 16</div><div>The type of x(0) is: 9</div><div>The integer associated with STRSXPs is: 16</div><div>The integer associated with CHARSXPs is: 9</div>
<div>Is x a string?: 1</div><div>Is x(0) a string?: 0</div><div>[1] "a" "b" "c"</div></div><div><br></div><div>Perhaps someone can illuminate further...</div><div>-Kevin</div>
<div><br><div class="gmail_quote">On Thu, Feb 7, 2013 at 10:55 AM, Davor Cubranic <span dir="ltr"><<a href="mailto:cubranic@stat.ubc.ca" target="_blank">cubranic@stat.ubc.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div style="word-wrap:break-word">I tracked this down to const-ness:<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><br></div><div><div><div>bar <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body='</div>

</div></div><div><div><div>const CharacterVector xs(xs_);</div></div></div><div><div><div>const std::string x(xs(0));</div></div></div><div><div><div>Rcout << x << std::endl;')</div></div></div></blockquote>

<div><div><br></div><div>fails with the compile error mentioned in my last message, while</div><div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div>foo <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body='</div>

</div><div><div>CharacterVector xs(xs_);</div></div><div><div>std::string x(xs(0));</div></div><div><div>Rcout << x << std::endl;')</div></div><div><div><br></div></div><div><div>foo(month.abb)</div></div>

</blockquote><div><div><br></div><div>works fine. I'll be happy to add a unit test to the package if the devs want it.</div><div><br></div><div>And to go back to my initial qustion: I'm still not sure why "as<std::string>" doesn't work:</div>

<div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><div>baz <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body='</div><div>CharacterVector xs(xs_);</div>

<div><div>std::string x = as<std::string>(xs(0));</div></div><div>Rcout << x << std::endl;')</div><div><br></div><div>baz(month.abb)</div></div></div></blockquote><div><div><br></div><div>
will throw "expecting a string".</div><span><font color="#888888"><div><br></div><div>Davor</div><div><br></div><div><br></div></font></span></div><div><div><div><div><div>On 2013-02-07, at 10:27 AM, Davor Cubranic wrote:</div>

<br></div></div><blockquote type="cite"><div><div><div style="word-wrap:break-word"><div><div>On 2013-02-07, at 10:15 AM, Kevin Ushey wrote:</div><br><blockquote type="cite"><div>One trick to get around this is to 'as' the entire CharacterVector into a std::vector< std::string >, and then index based off of that.</div>

<div><br></div><div>My guess is though, elements of CharacterVectors are 'const char*' s, so to convert them to strings you might want to just use std::string constructor, eg. std::string( xs(0) ).</div></blockquote>

<div><br></div>That used to work with 0.10.0, but when I upgraded this morning to 0.10.2, gives me the following compile error:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div>
rcppdb.cpp:131: error: no matching function for call to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(SEXPREC* const&)'</div>
<div>/usr/include/c++/4.2.1/bits/basic_string.tcc:233: note: candidates are: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(typename _Alloc::rebind<_CharT>::other::size_type, _CharT, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]</div>

<div>/usr/include/c++/4.2.1/bits/basic_string.tcc:226: note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]</div>

<div>/usr/include/c++/4.2.1/bits/basic_string.tcc:219: note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, typename _Alloc::rebind<_CharT>::other::size_type, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]</div>

<div>/usr/include/c++/4.2.1/bits/basic_string.tcc:208: note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&, typename _Alloc::rebind<_CharT>::other::size_type, typename _Alloc::rebind<_CharT>::other::size_type, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]</div>

<div>/usr/include/c++/4.2.1/bits/basic_string.tcc:197: note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&, typename _Alloc::rebind<_CharT>::other::size_type, typename _Alloc::rebind<_CharT>::other::size_type) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]</div>

<div>/usr/include/c++/4.2.1/bits/basic_string.tcc:183: note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]</div>

<div>/usr/include/c++/4.2.1/bits/basic_string.tcc:191: note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]</div>

<div>/usr/include/c++/4.2.1/bits/basic_string.h:2065: note:                 std::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]</div>

<div>make: *** [rcppdb.o] Error 1</div></div><div><br></div></blockquote><div>Perhaps this is caused by the same bug, introduced somewhere post-0.10.0.</div><div><br></div>Davor</div></div></div><div>_______________________________________________<br>

Rcpp-devel mailing list<br><a href="mailto:Rcpp-devel@lists.r-forge.r-project.org" target="_blank">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></div>

</blockquote></div><br></div></div></blockquote></div><br></div>