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