RcppParallel:将 CharacterMatrix 转换为 RMatrix<T>

RcppParallel: Converting CharacterMatrix to RMatrix<T>

本文关键字:lt gt RMatrix CharacterMatrix 转换 RcppParallel      更新时间:2023-10-16

您好,尊敬的社区,

我正在学习RcppParallel,在尝试使用以下代码将Rcpp::CharacterMatrix转换为RpppParallel::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

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

我不知道这是否可行,但如果可行,你会想使用类似RMatrix<SEXP>的东西,它会(假设)映射到矩阵内的底层CHARSXP上——其中你可以用CHAR访问下划线的const char*字符串。

不幸的是,在这种情况下,RMatrix类不够"智能",无法直接提供对底层字符串的访问,所以我相信您必须自己打开它。