RcppParallel:将CharacterMatrix转换为RMatrix <t> </t>

时间:2015-03-17 17:14:52

标签: c++ r rcpp

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

1 个答案:

答案 0 :(得分:2)

此处的问题是CharacterVectorCharacterMatrix类型实际上只是SEXP s的向量 - 更具体地说,CharacterVector包裹STRSXP,其内容是SEXP s(运行时类型CHARSXP)的数组。不幸的是,在与R的角色类型进行交互时,了解这些细节是必要的。

我不知道这是否有效,但如果确实如此,你会想要使用类似RMatrix<SEXP>的东西,它会(假设)映射到矩阵内的基础CHARSXP - 您可以使用const char*访问带有CHAR字符串的下划线。

RMatrix类不够“聪明”,不足以在这种情况下直接提供对底层字符串的访问,遗憾的是,所以我相信你必须自己解开它。