【问题标题】:Error converting between string types in Rcpp在 Rcpp 中的字符串类型之间转换时出错
【发布时间】:2019-12-25 21:17:45
【问题描述】:

我是使用 RCPP 的新手,并尝试编写一些代码,基本上重新创建 R 中“外部”函数的特殊情况。我必须使用字符串向量,第一个包含模式,第二个包含句子。我正在检查所有句子的所有模式,并尝试返回一个矩阵,该矩阵是每个模式在每个句子中出现的次数。

我已经取得了一些进展(尽管我确信你们中的一些人会被我的代码吓到):



#include <Rcpp.h>
#include <string.h>
#include <string>
#include <algorithm>
using namespace Rcpp;
// [[Rcpp::plugins("cpp11")]]

int addOccurrences(std::vector< std::string > &txt, std::vector< std::string > &pat) 
{ 
  int M = pat.size(); 
    int N = txt.size(); 
    int res = 0; 

    /* A loop to slide pat[] one by one */
    for (int i = 0; i <= N - M; i++) 
    {  
        /* For current index i, check for  
           pattern match */
        int j; 
        for (j = 0; j < M; j++) 
            if (txt[i+j] != pat[j]) 
                break; 

        // if pat[0...M-1] = txt[i, i+1, ...i+M-1] 
        if (j == M)   
        { 
           res++; 
           j = 0; 
        } 
    } 
    return res; 


} 


//[[Rcpp::export]]
NumericMatrix freqMatrix (Rcpp::StringVector x,Rcpp::StringVector y)
{

    Rcpp::NumericMatrix matrx(x.size(),y.size());
    int i = 1;
    int j = 1;



    std::vector<std::string> xstrings(x.size());
    int k;
    for (k = 0; k < x.size(); k++){
        xstrings[k] = x(k);
    }

    std::vector<std::string> ystrings(y.size());
    int l;
    for (l = 0; l < y.size(); l++){
        ystrings[l] = y(l);
    }




    for(i = 1; i<=x.size(); i++)
        {
        std::vector< std::string > txt = xstrings[i];

        for(j = 1; j<=y.size(); j++)
            {
            std::vector< std::string > pat = ystrings[j];
            matrx(i,j) = addOccurrences(txt, pat);
            j = j + 1;
            }
         i = i + 1;
        }
return matrx;
}


我已经摆脱了大多数错误,但我被困在底部附近。我得到的错误是:

"conversion from '__gnu_cxx::__alloc_traits<std::allocator<std::basic_string<char> > >::value_type {aka std::basic_string<char>}' to non-scalar type 'std::vector<std::basic_string<char> >' requested
   std::vector< std::string > txt = xstrings[i];"

我在第二次转换 `ystrings[j]' 时遇到同样的错误

我已经尝试了几种不同的方法来让它同时适用于“std::vector”和“Rcpp::StringVector”,但我很难过。

【问题讨论】:

  • xstrings[i]std::strings。您尝试从中初始化 std::vector&lt;std::string&gt;。那是行不通的。我不知道你想在这里做什么:要么省略元素访问,要么用一个元素创建一个范围,例如,使用... txt{ xstrings[i] }
  • 所以改成这样:std::string txt { xstrings[i] }; ?我正在尝试获取第 i 个元素并将其保存为字符串。
  • 应该可以工作,尽管如果您更改类型,您可以保持初始化不变。要点是创建一个std::initializer_list&lt;std::string&gt; 来初始化一个只有一个元素的向量:std::vector&lt;std::string&gt; txt{xstrings[i};。需要什么视实际使用而定。
  • 啊它编译了!谢谢!

标签: c++ r rcpp


【解决方案1】:

您将变量 xstrings 声明为字符串向量。

std::vector<std::string> xstrings(x.size());

然后在这个循环中,由于未知原因,从 1 而不是 0 开始(当i 等于x.size() 时,它似乎可以调用未定义的行为)

for(i = 1; i<=x.size(); i++)

    {
    std::vector< std::string > txt = xstrings[i];
    //

您声明了另一个字符串向量txt,并尝试使用类型为std;:string 的对象xstrings[i]; 对其进行初始化。

标准容器 std;:vector 中没有这样的非显式构造函数。所以编译器会报错。

相反,您可以写例如

    std::vector< std::string > txt( 1,  xstrings[i] );

【讨论】:

  • 哎呀,R 习惯从 1 开始初始化。谢谢。
【解决方案2】:

编译器抱怨是因为您声明了一个可以保存字符串(即 txt)的向量并试图将其初始化为一个字符串(即 xstrings[i])。它可能还会抱怨这条线:

std::vector< std::string > pat = ystrings[j];

鉴于 addOccurrences(...) 检查单个句子的单个模式,它不应该将 std::string 类型的变量作为输入参数吗?这意味着它应该声明如下:

int addOccurrences(const std::string & txt, const std::string & pat) 
{
     // do stuff...
}

freqMatrix 中的最后一个循环可以写成:

for(i = 1; i<=x.size(); i++)
{
    for(j = 1; j<=y.size(); j++)
    {
        matrx(i,j) = addOccurrences(xstrings[i], ystrings[j]);
    }
}

【讨论】:

    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 2014-10-01
    • 2010-11-29
    • 1970-01-01
    • 2012-07-29
    • 2012-06-04
    • 2019-12-09
    • 2017-10-12
    相关资源
    最近更新 更多