gpt4 book ai didi

r - 使用 Rcpp 构建包,未正确处理属性

转载 作者:行者123 更新时间:2023-12-04 12:00:44 24 4
gpt4 key购买 nike

我一直在尝试设置一个旨在在 RStudio 中使用 Rcpp 的 R 包,但我正在努力使事情与 Rcpp 属性一起正常工作。

我对其工作原理的理解相当薄弱,但我的理解如下:

  • 在源 C++ 文件中,您可以添加 Rcpp 属性,例如标签 // [[Rcpp::export]]标记用于导出的 C++ 函数,使其可用于 R。
  • 当您构建包时,Rcpp然后在文件 RcppExports.cpp 中生成适当的 C++ 代码和 R 源文件中的包装函数 RcppExports.R .

  • 当我构建我的包时,这似乎不能正常工作(如我所料)。生成 NAMESPACE 文件时,Roxygen 不能很好地使用它(所以我已经禁用了它)。标签 // [[Rcpp::export]]似乎只是标记了导出到 R 的函数,而不是同时标记了导出到包 Namespace 的函数。

    更重要的是,Rcpp 属性标签 // [[Rcpp::depends()]]没有得到正确处理。如果我复制代码 here进入一个新的源文件,并重建我的包, gccRcppExports.cpp 上引发错误文件说 BigMatrix标识符未声明,表明属性标记 // [[Rcpp::depends(bigmemory)]]没有得到正确处理。

    由于很多事情都没有像我预期的那样工作,我对 Rcpp 属性标签的理解缺少什么?

    最佳答案

    这是 RcppExports.cpp 的问题生成的文件。目前,没有办法教它包含来自其他地方的头文件,所以它只是不包含 bigmemory/MatrixAccessor.hpp。 .

    一种解决方法是这样做:

    #include <Rcpp.h>
    #include <bigmemory/MatrixAccessor.hpp>

    Rcpp::NumericVector BigColSums(Rcpp::XPtr<BigMatrix> pBigMat) {

    // Create the matrix accessor so we can get at the elements of the matrix.
    MatrixAccessor<double> ma(*pBigMat);

    // Create the vector we'll store the column sums in.
    Rcpp::NumericVector colSums(pBigMat->ncol());
    for (size_t i=0; i < pBigMat->ncol(); ++i)
    colSums[i] = std::accumulate(ma[i], ma[i]+pBigMat->nrow(), 0.0);
    return colSums;
    }

    // [[Rcpp::export]]
    Rcpp::NumericVector BigColSums( SEXP pBigMat ){
    return BigColSums( Rcpp::XPtr<BigMatrix>( pBigMat) ) ;
    }

    以便您在 .cpp 中捕获类型文件和 RcppExports.cpp只需要知道 SEXP .

    关于r - 使用 Rcpp 构建包,未正确处理属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18438291/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com