C++ RcppParallel:将CharacterMatrix转换为RMatrix<;T>;
你好,亲爱的社区 我正在学习RcppParallel,在尝试使用以下代码将Rcpp::CharacterMatrix转换为RcppParallel::RMatrix时遇到了这个问题:C++ RcppParallel:将CharacterMatrix转换为RMatrix<;T>;,c++,r,rcpp,C++,R,Rcpp,你好,亲爱的社区 我正在学习RcppParallel,在尝试使用以下代码将Rcpp::CharacterMatrix转换为RcppParallel::RMatrix时遇到了这个问题: struct CharMatDist : RcppParallel::Worker { const RcppParallel::RMatrix<std::string> A; const RcppParallel::RMatrix<std::string> B;
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();
}
...
}
struct CharMatDist:RcppParallel::Worker{
常量RcppParallel::RMatrix A;
常量RcppParallel::RMatrix B;
常数数值向量w;
RcppParallel::RMatrix 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
无法在初始化中将“Rcpp:Matrix::iterator(也称为Rcpp::internal::Proxy_iterator)”转换为“char*”
我也试过了
RMatrix<char>
RMatrix
而即使是手工铸造在身上也没有成功。我哪里做错了
如有任何建议和帮助,将不胜感激
YYA这里的问题是
CharacterVector
和CharacterMatrix
类型实际上只是SEXP
s的向量——更具体地说,CharacterVector
包装STRSXP
,其内容是SEXP
的数组(运行时类型CHARSXP
)。不幸的是,当与R的角色类型交互时,了解这些细节是必要的
我不知道这是否可行,但如果可行,您可能希望使用类似于RMatrix
的东西,它将(假定)映射到矩阵中的底层CHARSXP
s上——您可以使用char
访问下划线const char*
字符串
不幸的是,在这种情况下,
RMatrix
类不够“智能”,无法直接提供对底层字符串的访问,因此我相信您必须自己打开它。您可以包含其余代码吗(…
)?其余部分应该分别计算A和B中每对行之间的距离度量,我仍在处理这些度量。根据我的测试,现有代码已经足以完全产生错误。;)谢谢你,凯文。在尝试了你的建议和更多的可能性之后,比如使用迭代器访问RMatrix(,实际上是有效的),我仍然无法从CharacterVector或-Matrix转换一个。所以我决定简单地用数字编码字符。也许我们可以期待更新的改进>中的一个重要注意事项是,我们使用RMatrix类型访问矩阵。这是因为此代码将在调用R或Rcpp API不安全的后台线程上执行。RcppParallel包中包含RMatrix类,它提供了一个轻量级的线程安全包装器,用于包装R矩阵。