Hello亲爱的社区,
我正在学习RcppParallel并在尝试使用以下代码将Rcpp :: CharacterMatrix转换为RcppParallel :: RMatrix时遇到此问题:
struct CharMatDist : RcppParallel::Worker {
const RcppParallel::RMatrix<std::string> A;
const RcppParallel::RMatrix<std::string> B;
const NumericVector w;
RcppParallel::RMatrix<double> ret;
int n;
CharMatDist(CharacterMatrix A, CharacterMatrix B, NumericVector w, NumericMatrix ret)
: A(A), B(B), w(w), ret(ret) {
n = B.nrow();
}
...
}
正如画廊建议的那样,我希望转换会在A(A)等中自动执行,但它不起作用并且给我以下错误:
cannot convert 'Rcpp:Matrix<16>::iterator (aka Rcpp::internal::Proxy_iterator<Rcpp::internal::string_proxy<16> >)' to 'char*' in initialization
我也试过
RMatrix<char>
甚至手动演员身体但也没有成功。我在哪里做错了?
任何建议和帮助都将受到高度赞赏。
YYA
答案 0 :(得分:2)
此处的问题是CharacterVector
和CharacterMatrix
类型实际上只是SEXP
s的向量 - 更具体地说,CharacterVector
包裹STRSXP
,其内容是SEXP
s(运行时类型CHARSXP
)的数组。不幸的是,在与R的角色类型进行交互时,了解这些细节是必要的。
我不知道这是否有效,但如果确实如此,你会想要使用类似RMatrix<SEXP>
的东西,它会(假设)映射到矩阵内的基础CHARSXP
- 您可以使用const char*
访问带有CHAR
字符串的下划线。
RMatrix
类不够“聪明”,不足以在这种情况下直接提供对底层字符串的访问,遗憾的是,所以我相信你必须自己解开它。