[Rcpp-devel] "expecting a string" and not finding it in a CharacterVector

Romain Francois romain at r-enthusiasts.com
Fri Feb 8 08:11:31 CET 2013


Thanks. I will fix it. 

Romain

Le 8 févr. 2013 à 05:28, Davor Cubranic <cubranic at stat.ubc.ca> a écrit :

> On 13-02-07 07:24 PM, Davor Cubranic wrote:
>> The version assigning an element of a const CharacterVector to a const
>> std::string (named "bar" below) compiles and works fine in Rcpp 0.9.14,
>> so the problem was introduced after that.
> 
> To be more precise, it was introduced after 0.10.0 and before 0.10.1.
> 
> Davor
> 
>> 
>> On the other hand, "as<std::string>" (function "baz") fails as in
>> 0.10.2, probably for the same reason Kevin identified in his last email
>> (a check with ::Rf_isString).
>> 
>> Davor
>> 
>> 
>> On 13-02-07 10:55 AM, Davor Cubranic wrote:
>>> I tracked this down to const-ness:
>>> 
>>> 
>>>    bar <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body='
>>>    const CharacterVector xs(xs_);
>>>    const std::string x(xs(0));
>>>    Rcout << x << std::endl;')
>>> 
>>> 
>>> fails with the compile error mentioned in my last message, while
>>> 
>>>    foo <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body='
>>>    CharacterVector xs(xs_);
>>>    std::string x(xs(0));
>>>    Rcout << x << std::endl;')
>>> 
>>>    foo(month.abb)
>>> 
>>> 
>>> works fine. I'll be happy to add a unit test to the package if the devs
>>> want it.
>>> 
>>> And to go back to my initial qustion: I'm still not sure why
>>> "as<std::string>" doesn't work:
>>> 
>>>    baz <- cxxfunction(signature(xs_="character"), plugin='Rcpp', body='
>>>    CharacterVector xs(xs_);
>>>    std::string x = as<std::string>(xs(0));
>>>    Rcout << x << std::endl;')
>>> 
>>>    baz(month.abb)
>>> 
>>> 
>>> will throw "expecting a string".
>>> 
>>> Davor
>>> 
>>> 
>>> On 2013-02-07, at 10:27 AM, Davor Cubranic wrote:
>>> 
>>>> On 2013-02-07, at 10:15 AM, Kevin Ushey wrote:
>>>> 
>>>>> 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.
>>>>> 
>>>>> 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) ).
>>>> 
>>>> That used to work with 0.10.0, but when I upgraded this morning to
>>>> 0.10.2, gives me the following compile error:
>>>> 
>>>>    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&)'
>>>>    /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>]
>>>>    /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>]
>>>>    /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>]
>>>>    /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>]
>>>>    /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>]
>>>>    /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>]
>>>>    /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>]
>>>>    /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>]
>>>>    make: *** [rcppdb.o] Error 1
>>>> 
>>>> Perhaps this is caused by the same bug, introduced somewhere
>>>> post-0.10.0.
>>>> 
>>>> Davor
>>>> _______________________________________________
>>>> Rcpp-devel mailing list
>>>> Rcpp-devel at lists.r-forge.r-project.org
>>>> <mailto:Rcpp-devel at lists.r-forge.r-project.org>
>>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> Rcpp-devel mailing list
>>> Rcpp-devel at lists.r-forge.r-project.org
>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>> 
>> _______________________________________________
>> Rcpp-devel mailing list
>> Rcpp-devel at lists.r-forge.r-project.org
>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
> 
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


More information about the Rcpp-devel mailing list